By 一頁編程
我們知道BeautifulSoup庫是能夠解析html和xml文件的功能庫,那么我們該怎么理解它呢?
我們以html文件為例,任何一個(gè)html文件,如果打開它的源代碼,我們都能看到。它是由一組尖括號構(gòu)成的標(biāo)簽組織起來的,這里邊每一對尖括號形成了一個(gè)標(biāo)簽,而標(biāo)簽之間存在上下游關(guān)系,形成了一個(gè)標(biāo)簽樹。
所以我們可以說BeautifulSoup庫是解析、遍歷、維護(hù)標(biāo)簽樹的功能庫。只要你提供的文件是標(biāo)簽類型,那么BeautifulSoup庫都可以做很好的解析。
標(biāo)簽的基本結(jié)構(gòu)
我們以p標(biāo)簽為例。
<p class="title">......</p>
p標(biāo)簽是以一對尖括號形成的一個(gè)標(biāo)簽類型,單詞p就是這個(gè)標(biāo)簽的名稱。除了表示標(biāo)簽名稱、范圍的<p>和</p>,還有一個(gè)鍵值對構(gòu)成的屬性域:class="title"。這樣的一個(gè)格式構(gòu)成了標(biāo)簽的基本結(jié)構(gòu)。
理解BeautifulSoup
BeautifulSoup庫本身解析的是html和xml文檔,那么這個(gè)文檔與標(biāo)簽樹是一一對應(yīng)的,經(jīng)過了BeautifulSoup類的處理,html或xml文檔這樣的標(biāo)簽樹,就被轉(zhuǎn)換成一個(gè)BeautifulSoup類。BeautifulSoup類就是能夠代表標(biāo)簽樹的一個(gè)類型。
事實(shí)上我們認(rèn)為html文檔、標(biāo)簽樹和BeautifulSoup類這三者是等價(jià)的。在這個(gè)等價(jià)的基礎(chǔ)上我們就可以通過BeautifulSoup類,使得標(biāo)簽樹形成了一個(gè)變量,而對這個(gè)變量的處理就是對標(biāo)簽樹的相關(guān)的處理。
from bs4 import BeautifulSoup
soup = BeautifulSoup(‘<html>data</html>’, 'html.parser')
soup2 = BeautifulSoup(open('D://demo.html'), 'html.parser')
解析器
之前的例子我們使用了html解析器,那么除了html解析器,BeautifulSoup庫也可以使用四種其他的解析器。
| 解析器 | 使用方法 | 條件 |
|---|---|---|
| bs4的HTML解析器 | BeautifulSoup(mk, 'html.parser') | 安裝bs4庫 |
| lxml的HTML解析器 | BeautifulSoup(mk, 'lxml) | pip install lxml |
| lxml的xml解析器 | BeautifulSoup(mk, 'xml') | pip install lxml |
| html5lib的解析器 | BeautifulSoup(mk, 'html5lib') | pip install html5lib |
BeautifulSoup基本元素
下面我們介紹一下BeautifulSoup類的基本元素。
| 基本元素 | 說明 |
|---|---|
| Tag | 標(biāo)簽,最基本的信息組織單元,分別用<>和</>標(biāo)明開頭和結(jié)尾 |
| Name | 標(biāo)簽的名字,<p>...</p>的名字是’p‘,格式<tag>.name |
| Attributes | 標(biāo)簽的屬性,字典組織形式,格式<tag>.attrs |
| NavigableString | 標(biāo)簽內(nèi)非屬性字符串,格式<tag>.string |
| Comment | 標(biāo)簽內(nèi)字符串的注釋部分,一種特殊的Comment類型 |
Tag
標(biāo)簽是BeautifulSoup類里邊的最基本的信息組織單元,它與html和xml文檔中的一對尖括號相對應(yīng),它分別是用尖括號和尖括號中代反斜杠來標(biāo)明開頭和結(jié)尾。
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> soup.title
<title>This is a python demo page</title>
>>> soup.a
<a href="http://www.itdecent.cn/nb/11366912 class=" id="link1" py1"="">Python Crawler</a>
>>>
可以看到soup.title返回了title標(biāo)簽的內(nèi)容,soup.a返回了a標(biāo)簽的內(nèi)容。
Name
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> soup.title.name
'title'
>>> soup.a.name
'a'
>>>
可以通過對任何一個(gè)標(biāo)簽使用點(diǎn)name的方式獲得它的名字,那么這個(gè)名字顯示出來是字符串類型。
Attributes
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> tag = soup.a
>>> tag.attrs
{'href': 'http://www.itdecent.cn/nb/11366912 class=', 'py1"': '', 'id': 'link1'}
>>>
我們知道標(biāo)簽的屬性是在標(biāo)簽中標(biāo)明標(biāo)簽特點(diǎn)的相關(guān)區(qū)域,以字典形式來組織??梢杂?code>.attrs來獲得屬性的信息。
NavigableString
在標(biāo)簽尖括號的之間,是一種字符串,我們可以用.string來獲得其中的內(nèi)容。
Comment
Comment是一種特殊的標(biāo)簽形式,表示html中的注釋。