BeautifulSoup的使用文档
Installation
在Debian和Ubuntu中,可以通过包管理器安装
apt-get install python-bs4 # python2
apt-get install python3-bs4 # python3
或者可以直接使用python的包管理器进行安装
pip install beautifulsoup4
easy_install install beautifulsoup4
Install a parser
Beautiful Soup默认使用python标准库中的默认的HTML的解析器。但是,为了在解析速度上获取一定的性能提升,我们可以手动选择一些解析器。
解析器 | 用例 | 优点 | 缺点 |
---|---|---|---|
Python’s html.parser | BeautifulSoup(markup, “html.parser”) | 无外部依赖 速度尚可 支持较多python版本 | 速度慢于lxml,功能少于html5lib |
lxml’s HTML parser | BeautifulSoup(markup, “lxml”) | 非常快速 支持较多python版本 | 依赖C |
lxml’s XML parser | BeautifulSoup(markup, “lxml-xml”) | 非常快速 支持XML | 依赖C |
html5lib | BeautifulSoup(markup, “html5lib”) | 解析方式类似与web浏览器 支持html5 | 速度较慢,部分python依赖 |
Make the soup
默认支持file-like对象或者直接使用unicode字段。
from bs4 import BeautifulSoup
with open("index.html") as f:
soup = BeautifulSoup(fp)
soup = BeautifulSoup("<html>data</html>")
Kinds of objects
BeautifulSoup会把html文档解析成一个复杂的Python对象树。但是,一般操作的对象只有Tag、NavigableString、BeautifulSoup和Comment。
Tag
对应着html中的Tag标签
soup = BeautifulSoup("<a id=\"c\">Hello</a>"
tag = soup.b
type(tag) === Tag
# name
tag.name # a
# change name
tag.name = "c"
# attributes
tag["id"] # c
tag.attrs # {"id": "c"}
# operate tag's attribute
tag["id"] = "ddd" # <a id="ddd">Hello</a>
tag["id2"] = "ccc" # <a id="ddd" id2="ccc">Hello</a>
del tag["id2"] # <a id="ddd">Hello</a>
tag.get("id") # ddd
# multi-value attributes
”“”
BeautifulSoup支持将具有多个值的标签属性解析为一个列表,默认此属性是开启的,比如对于class属性
<a class="cls1 cls2"></a> => Tag_a["class"] => ["cls1", "cls2"]
我们可以通过在BeautifulSoup的生命中设置multi_valued_attributes选项控制此解析行为
“”“
css_soup = BeautifulSoup('<p class="body"></p>')
css_soup.p['class']
# ["body"]
css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]
no_list_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html', multi_valued_attributes=None)
no_list_soup.p['class']
# u'body strikeout'
NavigableString
用于代表html标签中的文本
tag.string # str
type(tag.string) # bs4.element.NavigableString
# 可以直接使用Unicode字符串进行转换
uncideo_string = unicode(tag.string)
# 该对象不支持直接编辑
# 可以直接通过replace_with对于字符串内容进行编辑
tag.string.replace_with("hello") # <tag>str</tag> -> <tag>hello</tag>
如果需要额外使用该对象的文本内容,建议使用Unicode进行转化后使用,其带着对整个解析树的应用,会造成内存的浪费。
BeautifulSoup
BeautifulSoup对象在绝大部分情况下可以看成基础的Tag进行使用,而Tag的大部分方法都是支持的,它的name属性是一个特定的值[document]
。
关于文档的注释和一些特殊字符
注释
对于注释,不同的访问形式得到的内容是不同的
soup = BeautifulSoup("<b><!--Hey?--></b>")
comment = soup.b.string # => bs4.element.Comment
comment # Hey?
soup.b.prettify() # =>
"""
<b>
<!--Hey?-->
</b>
"""
Stylesheet、Script和TemplateString
BeautifulSoup支持解析HTML文档中的Stylesheet、Script和TemplateString解析成对应的对象。
<style></style> <!-- bs4.element.Stylesheet -->
<script></script> <!-- bs4.element.Script -->
<template></template> <!-- bs4.element.TemplateString -->
注意 该功能尽在BeautifulSoup > 4.9.0支持,且目前的html5lib解析器未支持
这些对象的使用方法和NavigableString对象相同。
CDATA
对于特殊的CDATA的对象,也有一部分特定的新类别,如CData。
from bs4 import BeautifulSoup
cdata = CData("A CDATA block")
soup.xml.replace_with(cdata)
soup.xml.prettify() # =>
"""
<xml>
<![CDATA[A CDATA block]]>
</xml>
"""
导航树
(未完待续)