【问题标题】:BeautifulSoup4 missing tagsBeautifulSoup4 缺少标签
【发布时间】:2015-03-12 02:11:55
【问题描述】:

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

这是代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)

html 是 Google 主页的 HTML。

编辑:

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

【问题讨论】:

  • 你能再添加一点代码来展示你是如何获取 html 的吗?此外,根据您的编辑,与 str(soup) 相比,soup.prettify() 看起来是否更符合您的预期。最后,您可以尝试使用更简单的网页并发布前后(假设您可以找到符合 SO 推荐的最小、完整、验证示例的内容)
  • 我正在从发送到我的 MongoDB 数据库的 DOM 中检索 HTML。我只是提取 JSON,在 python 中读取它并将其转换为字符串。是的,我会用更简单的网站来做,谢谢你的建议。

标签: python html beautifulsoup html-parsing


【解决方案1】:

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

我怀疑,您正在通过urllib2requests 下载谷歌主页,并将您在str(soup) 中看到的内容与您在真实浏览器中看到的内容进行比较。如果是这种情况,那么您无法比较两者,因为urllib2requests 都不是浏览器,并且无法在页面加载后执行 javascript 或操作 DOM,或发出异步请求。使用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')

【讨论】:

  • 不,我正在从 JSON 属性值中检索 HTML,并比较 Python 应用程序中的两个字符串。尝试使用 lxml ,我仍然少了 10k 个字符。使用 html.parser,我终于得到了更多的字符,但是现在当我尝试将其解析为 ElementTree 时,我得到“XMLSyntaxError:开头和结尾标签不匹配:img 第 2 行和第 2 行,第 478 列”意味着形成 HTML 并没有完成它的工作。
  • @Tommz 感谢更新,是的,ElementTree 不是一个选项,因为它是 HTML 而不是 XML。
  • @Tommz 您能否提供一个可复制的示例或分享您正在处理的当前 HTML,指出解析后缺少的部分?有一些想法。谢谢。
  • BeautifulSoup 不是使 HTML 格式良好,相当于 XML 规则吗?
  • @Tommz 我们在谈论不同的事情,在这里您基本上尝试使用 XML 解析器解析格式不正确的 HTML。希望这是有道理的。
猜你喜欢
  • 2015-10-12
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2022-01-18
  • 2014-06-21
相关资源
最近更新 更多