Python利用Beautiful Soup模塊創(chuàng)建對(duì)象詳解
安裝
通過(guò) pip 安裝 Beautiful Soup 模塊:pip install beautifulsoup4
。
還可以使用 PyCharm IDE 來(lái)寫代碼,在 PyCharm 中的 Preferences 中找到 Project ,在里面搜索 Beautiful Soup 模塊,進(jìn)行安裝即可。
創(chuàng)建 BeautifulSoup 對(duì)象
Beautiful Soup 模塊廣泛使用從網(wǎng)頁(yè)中得到數(shù)據(jù)。我們能夠使用 Beautiful Soup 模塊從 HTML/XML 文檔中提取任何數(shù)據(jù),例如,網(wǎng)頁(yè)中的所有鏈接或者標(biāo)簽內(nèi)的內(nèi)容。
為了實(shí)現(xiàn)這一點(diǎn),Beautiful Soup 提供了不同的對(duì)象和方法。任何的 HTML/XML 文檔能夠轉(zhuǎn)化成不同的 Beautiful Soup 對(duì)象,這些對(duì)象有著不同的屬性和方法,我們能夠從中提取到需要的數(shù)據(jù)。
Beautiful Soup 總共有如下三種對(duì)象:
- BeautifulSoup
- Tag
- NavigableString
創(chuàng)建 BeautifulSoup 對(duì)象
創(chuàng)建一個(gè) BeautifulSoup 對(duì)象是任何 Beautiful Soup 工程的起點(diǎn)。
BeautifulSoup 可以通過(guò)傳一個(gè)字符串或者類文件對(duì)象(file-like object),例如機(jī)器上的文件或者網(wǎng)頁(yè)。
通過(guò)字符串創(chuàng)建 BeautifulSoup 對(duì)象
在 BeautifulSoup 的構(gòu)造器中通過(guò)傳遞一個(gè)字符串來(lái)創(chuàng)建對(duì)象。
helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld) print soup_string <html><body><p>Hello World</p></body></html>
通過(guò)類文件對(duì)象創(chuàng)建 BeautifulSoup 對(duì)象
在 BeautifulSoup 的構(gòu)造器中通過(guò)傳遞一個(gè)類文件對(duì)象(file-like object)來(lái)創(chuàng)建對(duì)象。這在解析在線網(wǎng)頁(yè)時(shí)非常有用。
url = "http://www.glumes.com" page = urllib2.urlopen(url) soup = BeautifulSoup(page) print soup
除了傳遞類文件對(duì)象之外,我們還可以傳遞本地文件對(duì)象到 BeautifulSoup 的構(gòu)造器來(lái)生成對(duì)象。
with open('foo.html','r') as foo_file : soup_foo = BeautifulSoup(foo_file) print soup_foo
為 XML 解析創(chuàng)建 BeautifulSoup 對(duì)象
Beautiful Soup 模塊同樣能夠用來(lái)解析 XML 。
當(dāng)創(chuàng)建一個(gè) BeautifulSoup 對(duì)象時(shí), Beautiful Soup 模塊將會(huì)選擇合適的 TreeBuilder 類來(lái)創(chuàng)建 HTML/XML 樹(shù)。默認(rèn)情況下,選擇 HTML TreeBuilder 對(duì)象,它將使用默認(rèn)的 HTML 解析器,產(chǎn)生一個(gè) HTML 結(jié)構(gòu)樹(shù)。在上面的代碼中,由字符串生成 BeautifulSoup 對(duì)象,就是將它解析成了 HTML 樹(shù)結(jié)構(gòu)。
如果我們想要 Beautiful Soup 模塊將輸入的內(nèi)容解析為 XML 類型,那么就需要在 Beautiful Soup 構(gòu)造器中精確指定使用的 features 參數(shù)。通過(guò)特定的 features 參數(shù),Beautiful Soup 將會(huì)選擇最適合的 TreeBuilder 類來(lái)滿足我們想要的特征。
理解 features 參數(shù)
每一個(gè) TreeBuilder 根據(jù)它使用的解析器將會(huì)有不同的特征。因此,輸入的內(nèi)容根據(jù)傳遞到構(gòu)造器的 features 參數(shù)也會(huì)有不同的結(jié)果。
在 Beautiful Soup 模塊中,TreeBuilder 當(dāng)前使用的解析器如下:
- lxml
- html5lib
- html.parser
BeautifulSoup 構(gòu)造器的 features 參數(shù)能夠接受一個(gè)字符串列表或一個(gè)字符串值。
當(dāng)前,每一個(gè) TreeBuilder 支持的 features 參數(shù)和解析器如下表所示:
Features | TreeBuilder | Parser |
---|---|---|
[‘lxml','html','fast','permissive'] | LXMLTreeBuilder | lxml |
[‘html','html5lib','permissive','strict','html5′] | HTML5TreeBuilder | html5lib |
[‘html','strict','html.parser'] | HTMLParserTreeBuilder | html.parser |
[‘xml','lxml','permissive','fast'] | LXMLTreeBuilderForXML | lxml |
根據(jù)指定的 feature 參數(shù),Beautiful Soup 將會(huì)選擇最合適的 TreeBuilder 類。如果在指定對(duì)應(yīng)的解析器時(shí),出現(xiàn)如下的報(bào)錯(cuò)信息,可能就是需要安裝對(duì)應(yīng)的解析器了。
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?
就 HTML 文檔而言,選擇 TreeBuilder 的順序是基于解析器建立的優(yōu)先級(jí),就如上表格所示的優(yōu)先級(jí)。首先是 lxml ,其次是 html5lib ,最后才是 html.parser 。例如,我們選擇 html 字符串作為 feature 參數(shù),那么如果 lxml 解析器可用,則 Beautiful Soup 模塊將會(huì)選擇 LXMLTreeBuilder 。如果 lxml 不可用,則會(huì)選擇 根據(jù) html5lib 解析器選擇 HTML5TreeBuilder 。如果在不可用,則會(huì)選擇根據(jù) html.parser 選擇 HTMLParserTreeBuilder 了。
至于 XML ,由于 lxml 是唯一的解析器,所以 LXMLTreeBuilderForXML 總是會(huì)被選擇的。
所以,為 XML 創(chuàng)建一個(gè) Beautiful Soup 對(duì)象的代碼如下:
helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld,features="xml") print soup_string
輸入的結(jié)果也是 XML 形式的文件 :
在創(chuàng)建 Beautiful Soup 對(duì)象時(shí),更好的實(shí)踐是指定解析器。這是因?yàn)椋煌慕馕銎鹘馕龅慕Y(jié)果內(nèi)容大不相同,尤其是在我們的 HTML 文檔內(nèi)容非法時(shí),結(jié)果更為明顯。
當(dāng)我們創(chuàng)建一個(gè) BeautifulSoup 對(duì)象時(shí),Tag 和 NavigableString 對(duì)象也就創(chuàng)建了。
創(chuàng)建 Tag 對(duì)象
我們可以從 BeautifulSoup 對(duì)象中得到 Tag 對(duì)象,也就是 HTML/XML 中的標(biāo)簽。
如下 HTML 代碼所示:
#!/usr/bin/python # -*- coding:utf-8 -*- from bs4 import BeautifulSoup html_atag = """ <html> <body> <p>Test html a tag example</p> <a >Home</a> <a href="http;//www.glumes.com/index.html'>Blog</a> </body> <html> """ soup = BeautifulSoup(html_atag,'html.parser') atag = soup.a print type(atag) print atag
從結(jié)果中可以看到 atag 的類型是 <class 'bs4.element.Tag'> 。而 soup.a 的結(jié)果就是 HTML 文檔中的第一個(gè) <a> 標(biāo)簽。
HTML/XML 標(biāo)簽對(duì)象具有名稱和屬性。名稱就是標(biāo)簽的名字,例如 標(biāo)簽 <a> 的名稱就是 a 。屬性則是標(biāo)簽的 class 、id 、style 等。Tag 對(duì)象允許我們得到 HTML 標(biāo)簽的名稱和屬性 。
Tag 對(duì)象的名稱
通過(guò) .name 方式得到 Tag 對(duì)象的名稱 。
tagname = atag.name print tagname
同時(shí)也能夠改變 Tag 對(duì)象的名稱:
atag.name = 'p'
這樣就將上面 HTML 文檔中的第一個(gè) <a> 標(biāo)簽名稱換成了 <p> 標(biāo)簽了。
Tag 對(duì)象的屬性
在 HTML 頁(yè)面中,標(biāo)簽可能有不同的屬性,例如 class 、id 、style 等。Tag 對(duì)象能夠以字典的形式訪問(wèn)標(biāo)簽的屬性。
atag = soup_atag.a print atag
也能通過(guò) .attrs 的方式訪問(wèn)到,這樣會(huì)將所有的屬性內(nèi)容都打印出來(lái) :
print atag.attrs {'href': u'http://www.glumes.com'}
創(chuàng)建 NavigableString 對(duì)象
NavigableString 對(duì)象持有 HTML 或 XML 標(biāo)簽的文本內(nèi)容。這是一個(gè) Unicode 編碼的字符串。
我們可以通過(guò) .string 的方式得到標(biāo)簽的本文內(nèi)容 。
navi = atag.string print type(navi) print navi.string
小結(jié)
代碼小結(jié)如下:
BeautifulSoup
soup = BeautifulSoup(String)
soup = BeautifulSoup(String,features=”xml”)
Tag
tag = soup.tag
tag.name
tag[‘a(chǎn)ttribute']
NavigableString
soup.tag.string
總結(jié)
以上就是關(guān)于Python使用Beautiful Soup模塊創(chuàng)建對(duì)象的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
詳解Django-channels 實(shí)現(xiàn)WebSocket實(shí)例
這篇文章主要介紹了詳解Django-channels實(shí)現(xiàn)WebSocket實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python爬取求職網(wǎng)requests庫(kù)和BeautifulSoup庫(kù)使用詳解
這篇文章主要為大家介紹了Python爬取求職網(wǎng)及其他網(wǎng)頁(yè)時(shí)requests庫(kù)和BeautifulSoup庫(kù)的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10python3實(shí)現(xiàn)elasticsearch批量更新數(shù)據(jù)
今天小編就為大家分享一篇python3實(shí)現(xiàn)elasticsearch批量更新數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python ValueError: invalid literal for int() with base 10 實(shí)用
這篇文章主要介紹了Python ValueError: invalid literal for int() with base 10 實(shí)用解決方法,本文使用了一個(gè)取巧方法解決了這個(gè)問(wèn)題,需要的朋友可以參考下2015-06-06Python使用PyAV提取視頻關(guān)鍵幀的實(shí)踐
本文主要介紹了Python使用PyAV提取視頻關(guān)鍵幀的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08