lxml/BeautifulSoup 解析器警告

新手上路,请多包涵

使用 Python 3,我试图通过使用 lxml 和 BeautifulSoup 来解析丑陋的 HTML(不受我的控制),如下所述:http: //lxml.de/elementsoup.html

具体来说,我想使用 lxml ,但我想使用 BeautifulSoup 因为就像我说的,它是丑陋的 HTML 并且 lxml 会自行拒绝它。

上面的链接说:“您需要做的就是将它传递给 fromstring() 函数:”

 from lxml.html.soupparser import fromstring
root = fromstring(tag_soup)

所以这就是我正在做的:

 URL = 'http://some-place-on-the-internet.com'
html_goo = requests.get(URL).text
root = fromstring(html_goo)

它的 工作原理 是我可以在那之后很好地操作 HTML。我的问题是每次运行脚本时,我都会收到这个烦人的警告:

 /usr/lib/python3/dist-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

To get rid of this warning, change this:

 BeautifulSoup([your markup])

to this:

 BeautifulSoup([your markup], "html.parser")

  markup_type=markup_type))

我的问题可能很明显:我没有自己实例化 BeautifulSoup。我已经尝试将建议的参数添加到 fromstring 函数,但这只会给我错误: TypeError: 'str' object is not callable 。到目前为止,在线搜索已证明无果。

我想摆脱那个警告信息。帮助表示赞赏,在此先感谢。

原文由 Teekin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 552
2 个回答

我必须阅读 lxml 和 BeautifulSoup 的源代码才能弄清楚这一点。

我在这里发布我自己的答案,以防将来有人需要它。

fromstring 有问题的函数定义如下:

 def fromstring(data, beautifulsoup=None, makeelement=None, **bsargs):

**bsargs 参数最终被发送到 BeautifulSoup 构造函数,它是这样调用的(在另一个函数中, _parse ):

 tree = beautifulsoup(source, **bsargs)

BeautifulSoup 构造函数定义如下:

 def __init__(self, markup="", features=None, builder=None,
             parse_only=None, from_encoding=None, exclude_encodings=None,
             **kwargs):

现在,回到问题中的警告,它建议将参数“html.parser”添加到 BeautifulSoup 的构造函数中。据此,这将是名为 features 的参数。

由于 fromstring 函数会将命名参数传递给 BeautifulSoup 的构造函数,我们可以通过将参数命名为 fromstring 函数来指定解析器,如下所示:

 root = fromstring(clean, features='html.parser')

噗。警告消失。

原文由 Teekin 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于其他初始化,例如:

 soup = BeautifulSoup(html_doc)

利用

soup = BeautifulSoup(html_doc, 'html.parser')

反而

原文由 Windsooon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题