By 一頁編程
我們知道BeautifulSoup庫是能夠解析html和xml文件的功能庫,那么我們該怎么理解它呢?
我們以html文件為例,任何一個html文件,如果打開它的源代碼,我們都能看到。它是由一組尖括號構成的標簽組織起來的,這里邊每一對尖括號形成了一個標簽,而標簽之間存在上下游關系,形成了一個標簽樹。
所以我們可以說BeautifulSoup庫是解析、遍歷、維護標簽樹的功能庫。只要你提供的文件是標簽類型,那么BeautifulSoup庫都可以做很好的解析。
標簽的基本結構
我們以p標簽為例。
<p class="title">......</p>
p標簽是以一對尖括號形成的一個標簽類型,單詞p就是這個標簽的名稱。除了表示標簽名稱、范圍的<p>
和</p>
,還有一個鍵值對構成的屬性域:class="title"
。這樣的一個格式構成了標簽的基本結構。
理解BeautifulSoup
BeautifulSoup庫本身解析的是html和xml文檔,那么這個文檔與標簽樹是一一對應的,經過了BeautifulSoup類的處理,html或xml文檔這樣的標簽樹,就被轉換成一個BeautifulSoup類。BeautifulSoup類就是能夠代表標簽樹的一個類型。
事實上我們認為html文檔、標簽樹和BeautifulSoup類這三者是等價的。在這個等價的基礎上我們就可以通過BeautifulSoup類,使得標簽樹形成了一個變量,而對這個變量的處理就是對標簽樹的相關的處理。
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 | 標簽,最基本的信息組織單元,分別用<>和</>標明開頭和結尾 |
Name | 標簽的名字,<p>...</p> 的名字是’p‘,格式<tag>.name |
Attributes | 標簽的屬性,字典組織形式,格式<tag>.attrs |
NavigableString | 標簽內非屬性字符串,格式<tag>.string |
Comment | 標簽內字符串的注釋部分,一種特殊的Comment類型 |
Tag
標簽是BeautifulSoup類里邊的最基本的信息組織單元,它與html和xml文檔中的一對尖括號相對應,它分別是用尖括號和尖括號中代反斜杠來標明開頭和結尾。
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> soup.title
<title>This is a python demo page</title>
>>> soup.a
<a href="http://www.lxweimin.com/nb/11366912 class=" id="link1" py1"="">Python Crawler</a>
>>>
可以看到soup.title
返回了title標簽的內容,soup.a
返回了a標簽的內容。
Name
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> soup.title.name
'title'
>>> soup.a.name
'a'
>>>
可以通過對任何一個標簽使用點name的方式獲得它的名字,那么這個名字顯示出來是字符串類型。
Attributes
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> tag = soup.a
>>> tag.attrs
{'href': 'http://www.lxweimin.com/nb/11366912 class=', 'py1"': '', 'id': 'link1'}
>>>
我們知道標簽的屬性是在標簽中標明標簽特點的相關區域,以字典形式來組織。可以用.attrs
來獲得屬性的信息。
NavigableString
在標簽尖括號的之間,是一種字符串,我們可以用.string
來獲得其中的內容。
Comment
Comment是一種特殊的標簽形式,表示html中的注釋。