将lxml设置为默认的BeautifulSoup解析器

时间:2015-01-06 00:49:30

标签: python html beautifulsoup html-parsing lxml

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

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

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

2 个答案:

答案 0 :(得分:16)

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

  

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

     

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

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

虽然注意,明确说明解析器被认为是最佳实践方法。有differences between parsers可能会导致细微的错误,如果你让BeautifulSoup选择最好的解析器,那么很难调试。您还必须记住,您需要安装lxml。并且,如果您不安装它,您甚至不会注意到它 - BeautifulSoup只会获得下一个可用的解析器而不会抛出任何错误。

如果您仍然不想明确指定解析器,请至少为自己或将使用您在项目的自述文件/文档中编写的代码的其他人做好记录,并在项目要求中列出lxml以及beautifulsoup4

此外:"Explicit is better than implicit."

答案 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)