我正在进行网络抓取项目,并遇到速度问题。为了尝试修复它,我想使用lxml而不是html.parser作为BeautifulSoup的解析器。我能够做到这一点:
soup = bs4.BeautifulSoup(html, 'lxml')
但我不想每次打电话给BeautifulSoup时都要重复输入'lxml'
。有没有办法在程序开始时设置一次使用哪个解析器?
答案 0 :(得分:16)
根据Specifying the parser to use文档页面:
BeautifulSoup构造函数的第一个参数是字符串或 打开文件句柄 - 您要解析的标记。第二个论点是如何 你想要解析标记。
如果您没有指定任何内容,您将获得最佳的HTML解析器 安装。然后,Beautiful Soup将lxml的解析器列为最佳解析器 html5lib,然后是Python的内置解析器。
换句话说,只需在同一个python环境中安装lxml
就可以使它成为默认的解析器。
虽然注意,明确说明解析器被认为是最佳实践方法。有differences between parsers可能会导致细微的错误,如果你让BeautifulSoup
选择最好的解析器,那么很难调试。您还必须记住,您需要安装lxml
。并且,如果您不安装它,您甚至不会注意到它 - BeautifulSoup
只会获得下一个可用的解析器而不会抛出任何错误。
如果您仍然不想明确指定解析器,请至少为自己或将使用您在项目的自述文件/文档中编写的代码的其他人做好记录,并在项目要求中列出lxml
以及beautifulsoup4
。
答案 1 :(得分:6)
显然首先看一下accepted answer。这是非常好的,至于这种技术性:
但我不想重复输入' lxml'我每次打电话 BeautifulSoup。有没有办法我可以设置一次使用哪个解析器 我的计划的开始?
如果我正确地理解了你的问题,我可以想到两种方法可以为你节省一些击键: - 定义一个包装函数,或者 - 创建一个部分函数。
# 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)