学科分类
目录
网络爬虫

构建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>
点击此处
隐藏目录