将 lxml 设置为默认 BeautifulSoup 解析器

Posted

技术标签:

【中文标题】将 lxml 设置为默认 BeautifulSoup 解析器【英文标题】:Set lxml as default BeautifulSoup parser 【发布时间】:2015-03-03 15:12:04 【问题描述】:

我正在做一个网页抓取项目,但遇到了速度问题。为了尝试修复它,我想使用 lxml 而不是 html.parser 作为 BeautifulSoup 的解析器。我已经能够做到这一点:

soup = bs4.BeautifulSoup(html, 'lxml')

但我不想每次调用 BeautifulSoup 时都重复输入'lxml'。有没有办法在我的程序开始时设置使用哪个解析器?

【问题讨论】:

lxml bs4 中的默认值,假设您安装了lxml。所以除非你碰巧在使用 BeautifulSoup3... 我正在使用bs4,但我不知道如何检查我当前使用的是哪个解析器。谢谢! 与***.com/questions/33511544 相关,包含其他详细信息。 【参考方案1】:

根据Specifying the parser to use 文档页面:

BeautifulSoup 构造函数的第一个参数是一个字符串或一个 打开文件句柄——你要解析的标记。第二个论点是如何 你想解析标记。

如果您不指定任何内容,您将获得最好的 HTML 解析器 安装。 Beautiful Soup 将 lxml 的解析器评为最佳,然后 html5lib 的,然后是 Python 的内置解析器。

换句话说,只需在同一个 python 环境中安装lxml 就可以使其成为默认解析器。

但请注意,明确声明解析器被认为是最佳实践方法。 differences between parsers 可能会导致细微的错误,如果您让 BeautifulSoup 自己选择最佳解析器,这些错误将难以调试。您还必须记住,您需要安装lxml。而且,如果您不安装它,您甚至不会注意到它 - BeautifulSoup 只会获得下一个可用的解析器而不会引发任何错误。

如果您仍然不想明确指定解析器,至少为您自己或其他人会使用您在项目的 README/文档中编写的代码做一个注释,并在您的项目中列出 lxml要求与beautifulsoup4一起。

另外:"Explicit is better than implicit."

【讨论】:

注意,对于 bs4 版本 4.5.1,当指定 'lxml' 解析器并且没有安装 bs4 does 错误输出:bs4.FeatureNotFound: 找不到树具有您要求的功能的构建器:lxml。需要安装解析器库吗?【参考方案2】:

显然先看看accepted answer。非常好,至于这个技术性:

但我不想每次打电话都重复输入“lxml” 美丽汤。有没有办法可以设置一次使用哪个解析器 我的程序开始了吗?

如果我正确理解了您的问题,我可以想到两种方法可以节省您的一些击键次数:- 定义包装函数,或 - 创建部分函数。

# V1 - define a wrapper function - most straight-forward.
import bs4

def bs_parse(html):
    return bs4.BeautifulSoup(html, 'lxml')
# ...
html = ...
bs_parse(html)

或者如果你想炫耀......

import bs4
from functools import partial
bs_parse = partial(bs4.BeautifulSoup, features='lxml')
# ...
html = ...
bs_parse(html)

【讨论】:

您能解释一下partial 的工作原理吗?与包装函数相比,使用它有什么优势吗? @r3robertson 这里有关于部分函数的很好的文档:docs.python.org/2/library/functools.html#functools.partial 在我看来,与包装器相比,部分函数在引擎盖下既慢又复杂,但是一旦实现,它相当容易使用。从数学的角度来看,偏函数是干净的,因为没有更好的词。其他语言也有这个,一些人认为它很好地使用了函数式编程,但你确实在速度和额外的导入方面付出了代价。我仍然使用偏函数,因为它们很有趣。 @r3robertson 顺便说一句,在使用某些将性能放在首位的编译语言时,部分函数不必产生额外的开销,但 Python 不是这些语言之一。然而,C++ 是 vittorioromeo.info/index/blog/cpp17_curry.html

以上是关于将 lxml 设置为默认 BeautifulSoup 解析器的主要内容,如果未能解决你的问题,请参考以下文章

【Python】 设置 pip 默认下载路径(含国内镜像源)

使用 lxml.etree.iterparse 解析损坏的 XML

原创关于lxml读取文件后不能正常输出中文

使用python编辑html,但lxml将漂亮的html实体转换为奇怪的编码

lxml 和 <wbr> 标签

将 python 脚本转换为使用 lxml 的 etree 模块的 linux 二进制文件的问题