我在Anaconda的发行版下使用BeautifulSoup 4作为bs4。如果我错了,请纠正我 - 我理解BeautifulSoup是用于将格式错误的HTML转换为格式良好的HTML的库。但是,当我为它的构造函数分配HTML时,我失去了超过一半的字符。它不应该只是修复HTML而不是清理它吗?在docs中,它没有得到很好的描述。
这是代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
其中html
是Google主页的HTML。
编辑:
可能是我通过str(soup)
检索HTML字符串的方式吗?
答案 0 :(得分:3)
首先,确保您看到这些"缺少标签"在html
进入BeautifulSoup
进行解析。可能问题不在于BeautifulSoup
如何解析HTML,而在于如何检索要解析的HTML数据。
我怀疑,您正在通过urllib2
或requests
下载Google首页,并将您在str(soup)
中看到的内容与您在真实浏览器中看到的内容进行比较。如果是这种情况,那么你无法比较两个,因为urllib2
和requests
都不是浏览器,并且在页面加载后无法执行javascript或操作DOM,或者make异步请求。您使用urllib2
或requests
获得的内容基本上是一个初始HTML页面"没有动态部分"。
如果问题仍然存在于BeautifulSoup
解析HTML的方式......
正如文档中明确指出的那样,行为取决于哪个解析器BeautifulSoup
会选择在引擎盖下使用:
HTML解析器之间也存在差异。如果你给美丽 汤是一个完美形成的HTML文档,这些差异无关紧要。 一个解析器会比另一个解析器更快,但他们都会给你一个 看起来与原始HTML文档完全相同的数据结构。但 如果文档没有完美形成,不同的解析器会给出 不同的结果。
请参阅Installing a parser和Specifying 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')