給定一個由N個非負整數構成的序列,我們來定義一下序列的中位數,如果N是奇數,在對序列排序後,中位數就是最中間的那個數,即排序後,中位數的位置為(N+1)/2,這裡序列的位置從1開始。如果N是偶數,則中
阿新 • • 發佈:2020-12-10
更多程式設計教程請到:菜鳥教程 https://www.piaodoo.com/
友情連結:
高州陽光論壇https://www.hnthzk.com/ 人人影視http://www.op-kg.com/Beautiful Soup就是Python的一個HTML或XML的解析庫,可以用它來方便地從網頁中提取資料。它有如下三個特點:
- Beautiful Soup提供一些簡單的、Python式的函式來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,通過解析文件為使用者提供需要抓取的資料,因為簡單,所以不需要多少程式碼就可以寫出一個完整的應用程式。
- Beautiful Soup自動將輸入文件轉換為Unicode編碼,輸出文件轉換為UTF-8編碼。你不需要考慮編碼方式,除非文件沒有指定一個編碼方式,這時你僅僅需要說明一下原始編碼方式就可以了。
- Beautiful Soup已成為和lxml、html6lib一樣出色的Python直譯器,為使用者靈活地提供不同的解析策略或強勁的速度。
首先,我們要安裝它:pip install bs4,然後安裝 pip install beautifulsoup4.
Beautiful Soup支援的解析器
下面我們以lxml解析器為例:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>Hello</p>', 'lxml')
print(soup.p.string)
結果:
Hello
beautiful soup美化的效果例項:
html = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link1"><!-- Elsie --></a>, <a href="http://example.com/lacie" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml')#呼叫prettify()方法。這個方法可以把要解析的字串以標準的縮排格式輸出 print(soup.prettify()) print(soup.title.string)
結果:
<html>
<head>
<title>
The Dormouse's story
</title>
</head>
<body>
<p class="title" name="dromouse">
<b>
The Dormouse's story
</b>
</p>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link1">
<!-- Elsie -->
</a>
,
<a class="sister" href="http://example.com/lacie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link2">
Lacie
</a>
and
<a class="sister" href="http://example.com/tillie" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="link3">
Tillie
</a>
;
and they lived at the bottom of a well.
</p>
<p class="story">
...
</p>
</body>
</html>
The Dormouse's story
下面舉例說明選擇元素、屬性、名稱的方法
html = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link1"><!-- Elsie --></a>, <a href="http://example.com/lacie" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print('輸出結果為title節點加里面的文字內容:\n',soup.title) print('輸出它的型別:\n',type(soup.title)) print('輸出節點的文字內容:\n',soup.title.string) print('結果是節點加其內部的所有內容:\n',soup.head) print('結果是第一個p節點的內容:\n',soup.p) print('利用name屬性獲取節點的名稱:\n',soup.title.name) #這裡需要注意的是,有的返回結果是字串,有的返回結果是字串組成的列表。 # 比如,name屬性的值是唯一的,返回的結果就是單個字串。 # 而對於class,一個節點元素可能有多個class,所以返回的是列表。 print('每個節點可能有多個屬性,比如id和class等:\n',soup.p.attrs) print('選擇這個節點元素後,可以呼叫attrs獲取所有屬性:\n',soup.p.attrs['name']) print('獲取p標籤的name屬性值:\n',soup.p['name']) print('獲取p標籤的class屬性值:\n',soup.p['class']) print('獲取第一個p節點的文字:\n',soup.p.string)
結果:
輸出結果為title節點加里面的文字內容:
<title>The Dormouse's story</title>
輸出它的型別:
<class 'bs4.element.Tag'>
輸出節點的文字內容:
The Dormouse's story
結果是節點加其內部的所有內容:
<head><title>The Dormouse's story</title></head>
結果是第一個p節點的內容:
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
利用name屬性獲取節點的名稱:
title
每個節點可能有多個屬性,比如id和class等:
{'class': ['title'], 'name': 'dromouse'}
選擇這個節點元素後,可以呼叫attrs獲取所有屬性:
dromouse
獲取p標籤的name屬性值:
dromouse
獲取p標籤的class屬性值:
['title']
獲取第一個p節點的文字:
The Dormouse's story
在上面的例子中,我們知道每一個返回結果都是bs4.element.Tag型別,它同樣可以繼續呼叫節點進行下一步的選擇。
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print('獲取了head節點元素,繼續呼叫head來選取其內部的head節點元素:\n',soup.head.title)
print('繼續呼叫輸出型別:\n',type(soup.head.title))
print('繼續呼叫輸出內容:\n',soup.head.title.string)
結果:
獲取了head節點元素,繼續呼叫head來選取其內部的head節點元素:
<title>The Dormouse's story</title>
繼續呼叫輸出型別:
<class 'bs4.element.Tag'>
繼續呼叫輸出內容:
The Dormouse's story
(1)find_all()
find_all,顧名思義,就是查詢所有符合條件的元素。給它傳入一些屬性或文字,就可以得到符合條件的元素,它的功能十分強大。
find_all(name , attrs , recursive , text , **kwargs)
他的用法:
html='''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print('查詢所有ul節點,返回結果是列表型別,長度為2:\n',soup.find_all(name='ul'))
print('每個元素依然都是bs4.element.Tag型別:\n',type(soup.find_all(name='ul')[0]))
#將以上步驟換一種方式,遍歷出來
for ul in soup.find_all(name='ul'):
print('輸出每個u1:',ul.find_all(name='li'))
#遍歷兩層
for ul in soup.find_all(name='ul'):
print('輸出每個u1:',ul.find_all(name='li'))
for li in ul.find_all(name='li'):
print('輸出每個元素:',li.string)
結果:
查詢所有ul節點,返回結果是列表型別,長度為2:
[<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>, <ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>]
每個元素依然都是bs4.element.Tag型別:
<class 'bs4.element.Tag'>
輸出每個u1: [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
輸出每個u1: [<li class="element">Foo</li>, <li class="element">Bar</li>]
輸出每個u1: [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
輸出每個元素: Foo
輸出每個元素: Bar
輸出每個元素: Jay
輸出每個u1: [<li class="element">Foo</li>, <li class="element">Bar</li>]
輸出每個元素: Foo
輸出每個元素: Bar
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援菜鳥教程www.piaodoo.com。