使用Python 3,我试图通过使用带有BeautifulSoup的lxml
解析丑陋的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
。到目前为止,在线搜索已证明无效。
我想摆脱那条警告信息。感谢提前感谢。
答案 0 :(得分:5)
我必须阅读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')
噗。警告消失了。
答案 1 :(得分:0)
在使用BeautifulSoup时,我们始终会执行以下操作:
[变量] = BeautifulSoup([您要分析的内容])
问题出在这里
如果您以前安装过“ lxml”,BeautifulSoup将自动注意到它已将其用作praser。这不是错误,只是一个通知。
那么如何将其删除?
只需执行以下操作:
[variable] = BeautifulSoup([您要分析的内容] ,features =“ lxml” )
“基于BeautifulSoup的最新版本4.6.3”
请注意,不同版本的BeautifulSoup添加此模式的方式或语法不同,只需仔细查看通知消息即可。
祝你好运!
答案 2 :(得分:0)
对于其他初始化对象,例如:
soup = BeautifulSoup(html_doc)
使用
soup = BeautifulSoup(html_doc, 'html.parser')
代替