作者:fushuzhen68139 | 来源:互联网 | 2023-05-28 11:47
我正在进行网络抓取项目,并遇到速度问题.为了尝试修复它,我想使用lxml而不是html.parser作为BeautifulSoup的解析器.我已经能够做到这一点:
soup = bs4.BeautifulSoup(html, 'lxml')
但我不想'lxml'
每次打电话给BeautifulSoup都要反复输入.有没有办法在程序开始时设置一次使用哪个解析器?
1> alecxe..:
根据指定解析器使用文档页面:
BeautifulSoup构造函数的第一个参数是一个字符串或一个打开的文件句柄 - 您想要解析的标记.第二个参数是你如何解析标记.
如果您没有指定任何内容,您将获得已安装的最佳HTML解析器.Beautiful Soup将lxml的解析器列为最佳,然后是html5lib,然后是Python的内置解析器.
换句话说,只需lxml
在同一个python环境中安装它就可以成为默认的解析器.
虽然注意,明确说明解析器被认为是最佳实践方法.解析器之间存在差异,这些差异可能会导致细微的错误,如果您要让BeautifulSoup
自己选择最佳解析器,则难以调试.你还必须记住你需要lxml
安装.并且,如果您不安装它,您甚至不会注意到它 - BeautifulSoup
只会获得下一个可用的解析器而不会抛出任何错误.
如果您仍然不想明确指定解析器,至少要为将来自己或将使用您在项目的README /文档中编写的代码的其他人做一个注释,并lxml
在项目要求中列出beautifulsoup4
.
此外:"明确比隐含更好".
2> Leonid..:
显然先看一下接受的答案.这是非常好的,至于这个技术性:
但是每次打电话给BeautifulSoup时我都不想重复输入'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)