python爬蟲-Beautiful Soup庫入門
說明
Beautiful Soup庫是一個HTML/XML的解析器,主要的功能是解析和提取 HTML/XML數據。
Beautiful Soup庫安裝
打開命令行使用pip安裝Beautiful Soup第三方庫
pip install beautifulsoup4
Beautiful Soup庫的引用
安裝時的名字是beautifulsoup4,但在python中引用這個庫的名字是bs4,其中BeautifulSoup類是最經常用的
from bs4 import BeautifulSoup
import bs4
Beautiful Soup庫解析器
python對大小寫比較敏感
BeautifulSoup對應一個HTML/XML文檔的全部內容
soup = BeautifulSoup("<html >data< /html>", "html.parser")
解釋器 | 使用方法 | 條件 |
---|---|---|
bs4的HTML解析器 | BeautifulSoup( mk, ‘html.parser’) | pip install beautifulsoup4 |
lxml的HTML解析器 | BeautifulSoup(mk, ‘lxml’) | pip install lxml |
lxml的XML解析器 | BeautifulSoup(mk, ‘xml’ ) | pip install lxml |
html5lib的解析器 | BeautifulSoup( mk, ‘html5lib’) | pip install html5lib |
Beautiful Soup類的基本元素
例子
以下例子都由w3school源代碼爲例子
tag標籤
任何存在於HTML語法中的標籤都可以用soup.<tag>訪問獲得
當HTML文檔中存在多個相同<tag>對應內容時,soup.<tag>返回第一個
基本元素 | 說明 |
---|---|
Tag | 標籤,最基本的信息組織單元,分別用<>和</ >標明開頭和結尾 |
tag的name(名字)
每個<tag>都有自己的名字,通過<tag>.name獲取,字符串類型
還可以通過parent獲取當前標籤的父標籤
基本元素 | 說明 |
---|---|
Name | 標籤的名字,<p>…</p>的名字是’p‘,格式:<tag>.name |
tag的Attributes(屬性)
一個<tag>可以有0或多個屬性,字典類型
基本元素 | 說明 |
---|---|
Attributes | 標籤的屬性,字典形式組織,格式:<tag>.attrs |
Tag的NavigableString(內容)
NavigableString可以跨越多個層次
基本元素 | 說明 |
---|---|
NavigableString | 標籤內非屬性字符串,<>…</ >中字符串,格式:<tag>.string |
Tag的Comment(註釋)
Comment是一種特殊類型
基本元素 | 說明 |
---|---|
Comment | 標籤內字符串的註釋部分,一種特殊的Comment類型 |
基於bs4庫的HTML內容遍歷方法
HTML的遍歷一共三種方法:下行遍歷、上行遍歷、平行遍歷
HTML基本格式:< >…</ >構成了所屬關係,形成了標籤的樹形結構
下行遍歷
BeautifulSoup類型是標籤樹的根節點
屬性 | 說明 |
---|---|
.contents | 子節點的列表,將<tag>所有兒子節點存入列表 |
.children | 子節點的迭代類型,與.contents類似,用於循環遍歷兒子節點 |
.descendants | 子孫節點的迭代類型,包含所有子孫節點,用於循環遍歷 |
使用時他會自動在每個標籤後面加一個換行符,第二個命令就是輸出行數,實際代碼行數爲37減去第一行的換行除以二實際一共18行代碼
使用contents屬性將本標籤內的所有代碼存入列表,可以控制輸出哪一行
遍歷兒子節點
for child in soup.body.children:
print(child)
遍歷子孫節點
for child in soup.body.descendants:
print(child)
上行遍歷
屬性 | 說明 |
---|---|
.parent | 節點的父親標籤 |
.parents | 節點先輩標籤的迭代類型,用於循環遍歷先輩節點 |
下邊的“h1”取整個網頁第一個“h1”,使用parent屬性就是“h1”的父親標籤包含的所有內容,第二行代碼的soup本身等級就已經是最大的(整個html文件),他的父親就是個空
使用parents屬性遍歷HTML中一個標籤的父標籤的名字,其中需要判斷父標籤是否爲空,當爲空時結束
for parent in soup.li.parents:
if parent is None:
print(parent)
else:
print(parent.name)
平行遍歷
屬性 | 說明 |
---|---|
.next_sibling | 返回按照HTML文本順序的下一個平行節點標籤 |
.previous_sibling | 返回按照HTML文本順序的上一個平行節點標籤 |
.next_siblings | 迭代類型,返回按照HTML文本順序的後續所有平行節點標籤 |
.previous_siblings | 迭代類型,返回按照HTML文本順序的前續所有平行節點標籤 |
平行遍歷發生在同一個父節點下的各節點間,下面代碼中由於每個標籤後都很了一個換行符,所以使用一個next_sibling屬性時出現的是換行符,在加一個next_sibling就會顯示本標籤的下一個平行節點標籤
同理previous_sibling屬性返回本標籤的上一個平行標籤也是和上面的說法一樣
遍歷後續節點,next_siblings
for sibling in soup.a.next_siblings:
print(sibling)
遍歷前續節點,previous_siblings
for sibling in soup.p.previous_siblings:
print(sibling)
基於bs4庫的HTML格式輸出
每當我們將整個網頁的代碼顯示出來時,代碼亂七八糟的,都是在一行裏顯示出來全部代碼,下面的代碼還不是多行,由於電腦屏幕問題他給你擠壓到多行
prettify()
我們可以使用prettify()方法將代碼整潔的輸出到屏幕上,使用後每個標籤佔用一行(不是一對標籤),一段文字佔一行,從下圖看原本的130行被搞成了858行…
.prettify( )爲HTML文本<>及其內容增加’\n’
.prettify( )可用於標籤,方法:<tag>.prettify( )
bs4庫的編碼
bs4庫將任何HTML輸入都變成utf-8編碼
Python 3.x默認支持編碼是utf-8,解析無障礙
以上均爲個人學習筆記,如有錯誤請指正,共同學習,謝謝。