构建BeautifulSoup对象
通过一个字符串或者类文件对象(存储在本地的文件句柄或Web网页句柄)可以创建BeatutifulSoup类的对象。
BeatutifulSoup类中构造方法的语法如下:
def __init__(self, markup="", features=None, builder=None,
parse_only=None, from_encoding=None, exclude_encodings=None,
**kwargs)
上述方法的一些参数含义如下:
builder:表示指定的解析器;
from_encoding:表示指定的编码格式;
exclude_encodings:表示排除的编码格式;
例如,根据字符串html_doc创建一个BeatutifulSoup对象,示例如下:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'lxml')
上述示例中,在创建BeatutifulSoup实例时共传入了两个参数。其中,第一个参数表示包含被解析HTML文档的字符串,第二个参数表示使用lxml解析器进行解析。
目前,bs4支持的解析器包括Python标准库、lxml和html5lib。为了让大家更好地选择合适的解析器,接下来,通过一张表来列举它们的使用方法和优缺点,具体如表1所示。
表1 bs4支持的解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") | 1)Python的内置标准库 <br />2)执行速度适中 <br />3)文档容错能力强 | Python 2.7.3或3.2.2之前的版本中文档容错能力差 |
lxml HTML解析器 | BeautifulSoup(markup, "lxml") | 1)速度快 <br />2)文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml") | 1)速度快 <br />2)唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 1)最好的容错性 <br />2)以浏览器的方式解析文档 <br />3)生成HTML5格式的文档 | 1)速度慢 <br />2)不依赖外部扩展 |
在创建BeatutifulSoup对象时,如果没有明确地指定解析器,那么BeatutifulSoup对象会根据当前系统安装的库自动选择解析器,解析器的选择顺序为:lxml, html5lib,Python标准库。在下面两种情况下,选择解析器的优先顺序会发生变化,具体如下:
要解析的文档是什么类型,目前支持“html”、“xml”和“html5”。
指定使用哪种解析器。
如果明确指定的解析器没有安装,那么BeatutifulSoup对象会自动选择其它的方案。不过,目前只有 lxml 解析器支持解析XML文档,一旦没有安装lxml库,就无法得到解析后的对象。
使用print函数输出刚刚创建的BeatutifulSoup对象soup,代码如下:
print(soup.prettify())
上述示例中调用了prettify()方法进行打印,既可以为HTML标签和内容增加换行符,又可以对标签做相关的处理,以便于更加友好地显示HTML内容。为了直观地比较这两种情况,下面分别列出直接打印和调用prettify()方法后打印的结果。
直接使用print函数进行输出,示例结果如下:
<html><head><title>The Dormouse's story</title></head>
<body>
</body></html>
调用prettify()方法后进行输出,示例结果如下:
<html>
<head>
<title>
The Dormouse's story
</title>
</head>
<body>
</body>
</html>