【问题标题】:BeautifulSoup: how to ignore spurious end tagsBeautifulSoup:如何忽略虚假的结束标签
【发布时间】:2016-03-26 01:04:24
【问题描述】:

我已经阅读了很多关于 BeautifulSoup 的好东西,这就是为什么我目前正在尝试使用它来抓取一组 HTML 格式错误的网站。

不幸的是,BeautifulSoup 的一个功能目前几乎是个大热门:

似乎当 BeautifulSoup 遇到一个从未打开的结束标记(在我的情况下为 </p>)时,它决定改为结束文档。 此外,在这种情况下,find 方法似乎不搜索(自诱导)</html> 标记后面的内容。这意味着当我感兴趣的块恰好位于虚假的结束标记后面时,我无法访问内容。

有没有办法可以配置 BeautifulSoup 以忽略不匹配的结束标签,而不是在遇到它们时关闭文档?

【问题讨论】:

  • 鉴于这种行为,我认为您使用的是html5lib。 HTML 规范说,堆栈中没有 p 元素的 </p> 会打开一个新元素,因此您在这里看到的是标准所说的以及所有浏览器所做的。
  • 我有类似的行为,错误的</span> 结束标记正在截断表格(page.find('table') 只返回表格的一部分直到错误的标记),使用“html.parser” . lxml 和 html5lib 都成功处理了它,所以我们选择了 lxml,因为它更快。

标签: python html python-3.x beautifulsoup


【解决方案1】:

BeautifulSoup 不进行任何解析,它使用专用解析器(lxmlhtml.parserhtml5lib)的输出。

如果您现在使用的解析器不能按照您想要的方式处理损坏的 HTML,请选择一个不同的解析器。 lxml 是更快的解析器,可以很好地处理损坏的 HTML,html5lib 最接近浏览器解析损坏的 HTML 的方式,但要慢得多。

另请参阅 BeautifulSoup 文档中的 Installing a parser 以及 Differences between parsers section

【讨论】:

  • html.parser 破坏了我正在搜索的元素中的一个无关的结束标记,截断了额外标记处的输出;一旦我找到您的答案并更改了我的解析器,我发现其他两个解析器都可以更优雅地处理它。感谢您提供有关相对速度的提示,很高兴知道 html5lib 的输出与浏览器的行为最相似,以防我们将来遇到导致 lxml 出错的事情!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2011-10-03
  • 2010-12-16
  • 1970-01-01
相关资源
最近更新 更多