Beautifulsoup
html标签转化成树结构
结构化输出tag树
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())
按照点的方式寻找标签
soup.title #title是标签的名字
# <title>The Dormouse's story</title>
soup.title.name #title标签的name属性
# u'title'
soup.title.string #title标签的字符串
# u'The Dormouse's story'
soup.title.parent.name #父节点的名字
# u'head'
soup.p #p标签
# <p class="title"><b>The Dormouse's story</b></p>
soup.p['class'] #p标签的class属性
# u'title'
找到所有a标签的某个属性值,比如链接的值
for link in soup.find_all('a'):
print(link.get('href'))
获取所有的文字内容
soup.get_text()
解析器
不同解析器的区别
创建beautifulsoup对象的时候第二个参数指定了使用的解析器类型,如果不指定bs4将会自动指定,指定的顺序是lxml, html5lib, Python标准库,主要看环境中安装了哪个。
解析器之间的区别
python标准库
BeautifulSoup(markup, "html.parser")
lxml解析
BeautifulSoup(markup, "lxml")
lxml-xml解析
BeautifulSoup(markup, ["lxml-xml"])
BeautifulSoup(markup, "xml")
html5lab解析
BeautifulSoup(markup, "html5lib")
最好的容错性
对于这一段html标签
BeautifulSoup("<a><b /></a>")
html结构解析的内容
自动补全b标签
<html><head></head><body><a><b></b></a></body></html>
xml解析的内容
不会补全内容,并且文档添加了xml文件头
<?xml version="1.0" encoding="utf-8"?>
<a><b/></a>
html解析器也有区别,如果文档是标准的html文件那么不会产生区别,如果不标准会产生轻微的差别
lxml解析
自动忽略了错误标签并且补全了不完整的标签
BeautifulSoup("<a></p>", "lxml")
# <html><body><a></a></body></html>
html5lib解析
html5lib自动补全了所有的标签
# <html><head></head><body><a><p></p></a></body></html>
python内置库
不会补全html文档和标签
# <a></a>