将 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