BeautifulSoup4缺少标签

时间:2015-03-12 02:11:55

标签: python html beautifulsoup html-parsing

我在Anaconda的发行版下使用BeautifulSoup 4作为bs4。如果我错了,请纠正我 - 我理解BeautifulSoup是用于将格式错误的HTML转换为格式良好的HTML的库。但是,当我为它的构造函数分配HTML时,我失去了超过一半的字符。它不应该只是修复HTML而不是清理它吗?在docs中,它没有得到很好的描述。

这是代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)

其中html是Google主页的HTML。

编辑:

可能是我通过str(soup)检索HTML字符串的方式吗?

1 个答案:

答案 0 :(得分:3)

首先,确保您看到这些"缺少标签"在html进入BeautifulSoup进行解析。可能问题不在于BeautifulSoup如何解析HTML,而在于如何检索要解析的HTML数据。

我怀疑,您正在通过urllib2requests下载Google首页,并将您在str(soup)中看到的内容与您在真实浏览器中看到的内容进行比较。如果是这种情况,那么你无法比较两个,因为urllib2requests都不是浏览器,并且在页面加载后无法执行javascript或操作DOM,或者make异步请求。您使用urllib2requests获得的内容基本上是一个初始HTML页面"没有动态部分"。


如果问题仍然存在于BeautifulSoup解析HTML的方式......

正如文档中明确指出的那样,行为取决于哪个解析器BeautifulSoup会选择在引擎盖下使用:

  

HTML解析器之间也存在差异。如果你给美丽   汤是一个完美形成的HTML文档,这些差异无关紧要。   一个解析器会比另一个解析器更快,但他们都会给你一个   看起来与原始HTML文档完全相同的数据结构。但   如果文档没有完美形成,不同的解析器会给出   不同的结果。

请参阅Installing a parserSpecifying the parser to use

由于您未明确指定解析器,因此应用以下规则:

  

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

另见Differences between parsers


换句话说,尝试使用不同的解析器来解决问题,看看结果会有什么不同:

soup = BeautifulSoup(html, 'lxml')
soup = BeautifulSoup(html, 'html5lib')
soup = BeautifulSoup(html, 'html.parser')