4

我在用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦。结果表明,较新版本中使用的 HTMLParser 比以前使用的 SGMLParser 容错性差。


BeautifulSoup 有某种调试模式吗?我正试图弄清楚如何阻止它在我从一个螃蟹网站加载的一些讨厌的 HTML 上运行:

<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>

<HTTP-EQUIV...>BeautifulSoup 在标记后放弃

In [1]: print BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

问题显然是 HTTP-EQUIV 标签,它确实是一个非常畸形的<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">标签。显然,我需要将此指定为自动关闭,但无论我指定什么,我都无法修复它:

In [2]: print BeautifulSoup(c,selfClosingTags=['http-equiv',
                            'http-equiv="pragma"']).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

是否有一个详细的调试模式,BeautifulSoup 会告诉我它在做什么,所以我可以弄清楚在这种情况下它把什么当作标签名?

4

3 回答 3

6

Beautiful Soup 3.1.0 有问题吗?建议使用html5lib的解析器作为解决方法之一。

#!/usr/bin/env python
from html5lib import HTMLParser, treebuilders

parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"))

c = """<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>"""

soup = parser.parse(c)
print soup.prettify()

输出:

<html>
 <head>
  <title>
   Title
  </title>
 </head>
 <body>
  <http-equiv="pragma" content="NO-CACHE">
   ...
        ...
  </http-equiv="pragma">
 </body>
</html>

输出显示 html5lib 在这种情况下并没有解决问题。

于 2009-03-12T13:20:25.427 回答
3

尝试lxml(及其 html 模块)。尽管它的名字,它也用于解析和抓取 HTML。它比 BeautifulSoup 快得多,它甚至比 BeautifulSoup 更好地处理“损坏”的 HTML。如果您不想学习 lxml API,它也有适用于 BeautifulSoup 的兼容性 API。

Ian Blicking 同意

没有理由再使用 BeautifulSoup,除非您使用的是 Google App Engine 或其他任何不纯 Python 的东西。

于 2009-08-03T15:40:41.023 回答
2

你的问题一定是别的;这对我来说可以:

In [1]: import BeautifulSoup

In [2]: c = """<HTML>
   ...:     <HEAD>
   ...:         <TITLE>Title</TITLE>
   ...:         <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
   ...:     </HEAD>
   ...:     <BODY>
   ...:         ...
   ...:         ...
   ...:     </BODY>
   ...: </HTML>
   ...: """

In [3]: print BeautifulSoup.BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
  <http-equiv>
  </http-equiv>
 </head>
 <body>
  ...
        ...
 </body>
</html>


In [4]: 

这是带有 BeautifulSoup 3.0.7a 的 Python 2.5.2 — 也许在旧/新版本中有所不同?这正是 BeautifulSoup 处理得如此漂亮的那种汤,所以我怀疑它是否在某些时候被改变了……你在问题中没有提到的结构还有什么其他的吗?

于 2009-01-19T23:40:08.300 回答