BeautifulSoup 3.1解析器很容易打破

Mat*_*Mat 3 html python parsing beautifulsoup

我在使用BeautifulSoup解析一些狡猾的HTML时遇到了麻烦.事实证明,较新版本中使用的HTMLParser不如先前使用的SGMLParser容忍.


BeautifulSoup有某种调试模式吗?我正在试图弄清楚如何阻止它从一个令人讨厌的HTML borking我从一个crabby网站加载:

<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

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

In [1]: print BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>
Run Code Online (Sandbox Code Playgroud)

这个问题显然是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>
Run Code Online (Sandbox Code Playgroud)

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

jfs*_*jfs 6

有美丽的汤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()
Run Code Online (Sandbox Code Playgroud)

输出:

<html>
 <head>
  <title>
   Title
  </title>
 </head>
 <body>
  <http-equiv="pragma" content="NO-CACHE">
   ...
        ...
  </http-equiv="pragma">
 </body>
</html>
Run Code Online (Sandbox Code Playgroud)

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