使用 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 许可协议
我必须阅读
lxml
和 BeautifulSoup 的源代码才能弄清楚这一点。我在这里发布我自己的答案,以防将来有人需要它。
fromstring
有问题的函数定义如下:**bsargs
参数最终被发送到 BeautifulSoup 构造函数,它是这样调用的(在另一个函数中,_parse
):BeautifulSoup 构造函数定义如下:
现在,回到问题中的警告,它建议将参数“html.parser”添加到 BeautifulSoup 的构造函数中。据此,这将是名为
features
的参数。由于
fromstring
函数会将命名参数传递给 BeautifulSoup 的构造函数,我们可以通过将参数命名为fromstring
函数来指定解析器,如下所示:噗。警告消失。