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 2.7.3 or 3.2.2前的班中文容错能力差 |
lxml HTML解析器 | BeautifulSoup(DocumentName, "lxml") |
|
需要安装C语言库 |
lxml XML解析器 |
BeautifulSoup(DocumentName, "xml") BeautifulSoup(DocumentName, ["lxml","xml"]) |
|
需要安装C语言库 |
html5lib | BeautifulSoup(DocumentName, "html5lib") |
|
速度慢,需要依赖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 νεμω\n</h1>‘ """
原文:https://www.cnblogs.com/belle-ls/p/10364625.html