1. 程式人生 > >Python BeautifulSoup庫的用法

Python BeautifulSoup庫的用法

html5 pan int parser span imp 查找 ble 並且

BeautifulSoup是一個可以從HTML或者XML文件中提取數據的Python庫,它通過解析器把文檔解析為利於人們理解的文檔導航模式,有利於查找和修改文檔。

BeautifulSoup3目前已經停止開發,現在推薦使用BeautifulSoup4,它被移植到了bs4中。

# 使用時需要導入
from bs4 import BeautifulSoup

解析器

BeautifulSoup4中常用4種主要的解析器,使用前需要安裝:

#不同系統安裝方法
$ apt-get install Python-lxml
$ easy_install lxml
$ pip install lxml

# pycharm中安裝可以先import xxx,顯示有錯誤然後點擊安裝,安裝後刪除import語句,即可正常使用

解析器的優缺點對比
解析器 使用方法 優勢 劣勢
Python標準庫

BeautifulSoup(DocumentName, "html.parser")

  • Python的內置標準庫
  • 不需要單獨安裝
  • 執行速度適中
  • 文檔容錯能力強
Python 2.7.3 or 3.2.2前的班中文容錯能力差
lxml HTML解析器 BeautifulSoup(DocumentName, "lxml")
  • 速度快
  • 文檔容錯能力強
需要安裝C語言庫
lxml XML解析器

BeautifulSoup(DocumentName, "xml")

BeautifulSoup(DocumentName, ["lxml","xml"])

  • 速度快
  • 唯一支持XML的解析器
需要安裝C語言庫
html5lib BeautifulSoup(DocumentName, "html5lib")
  • 最好的容錯
  • 以瀏覽器的方式解析文檔
  • 生成HTML5格式的文檔
速度慢,需要依賴python庫

不同解析器的解析結果:

# 符合HTML標準的解析結果
htmldoc = "<a><p></p></a>" print
("None :",BeautifulSoup(htmldoc)) print("html.parser :", BeautifulSoup(htmldoc, "html.parser")) print("lxml :", BeautifulSoup(htmldoc, "lxml")) print("xml :", BeautifulSoup(htmldoc, "lxml-xml")) print("html5lib :", BeautifulSoup(htmldoc, "html5lib")) """ 結果為: None : <html><body><a><p></p></a></body></html> html.parser : <a><p></p></a> lxml : <html><body><a><p></p></a></body></html> xml : <?xml version="1.0" encoding="utf-8"?>   <a><p/></a> html5lib : <html><head></head><body><a><p></p></a></body></html> """
# 不符合HTML標準的解析結果
htmldoc = "<a></p></a>"
print("None        :",BeautifulSoup(htmldoc))
print("html.parser :", BeautifulSoup(htmldoc, "html.parser"))
print("lxml        :", BeautifulSoup(htmldoc, "lxml"))
print("xml         :", BeautifulSoup(htmldoc, "lxml-xml"))
print("html5lib    :", BeautifulSoup(htmldoc, "html5lib"))

"""
結果為:
None        : <html><body><a></a></body></html>
html.parser : <a></a>
lxml        : <html><body><a></a></body></html>
xml         : <?xml version="1.0" encoding="utf-8"?>
          <a/>
html5lib    : <html><head></head><body><a><p></p></a></body></html>
"""

html5lib會把所有的標簽不全,並且加上html、head、body,標準的html格式;默認、html.parser、lxml 解析器會把錯誤標簽忽略掉。

編碼

任何HTML或者XML文檔都有自己的編碼方式,但使用BeautifulSoup解析後,文檔都會被轉換為Unicode,輸出時編碼均為UTF-8。

因為BeautifulSoup用來編碼自動檢測庫來識別當前文檔的編碼,並自動轉換為Unicode編碼。但也有小概率會識別出錯,可以用.original_encoding來檢測編碼格式。

並且設置from_encoding參數可以提高文檔的解析速度。

htmldoc = b"<h1>\xed\xe5\xec\xf9</h1>"
soup = BeautifulSoup(htmldoc, from_encoding="iso-8859-8")
print(soup.h1)
print(soup.original_encoding)


"""
結果:
<h1>????</h1>
‘iso8859-8‘
"""

指定輸出編碼:


htmldoc = b"<h1>\xed\xe5\xec\xf9</h1>"
soup = BeautifulSoup(htmldoc, from_encoding="iso-8859-8")
print(soup.prettify("latin-1"))
"""
結果:
b‘<h1>\n &#957;&#949;&#956;&#969;\n</h1>‘ """

Python BeautifulSoup庫的用法