为什么BeautifulSoup会抛出这个HTMLParseError?

时间:2009-07-10 19:57:18

标签: python exception parsing beautifulsoup malformed

我认为BeautifulSoup将能够处理格式错误的文档,但是当我发送页面的来源时,会打印下面的回溯:


Traceback (most recent call last):
  File "mx.py", line 7, in 
    s = BeautifulSoup(content)
  File "build\bdist.win32\egg\BeautifulSoup.py", line 1499, in __init__
  File "build\bdist.win32\egg\BeautifulSoup.py", line 1230, in __init__
  File "build\bdist.win32\egg\BeautifulSoup.py", line 1263, in _feed
  File "C:\Python26\lib\HTMLParser.py", line 108, in feed
    self.goahead(0)
  File "C:\Python26\lib\HTMLParser.py", line 150, in goahead
    k = self.parse_endtag(i)
  File "C:\Python26\lib\HTMLParser.py", line 314, in parse_endtag
    self.error("bad end tag: %r" % (rawdata[i:j],))
  File "C:\Python26\lib\HTMLParser.py", line 115, in error
    raise HTMLParseError(message, self.getpos())
HTMLParser.HTMLParseError: bad end tag: u"", at line 258, column 34

它不应该能够处理这种东西吗?如果它可以处理它们,我怎么能这样做?如果没有,是否有可以处理格式错误的文档的模块?

编辑:这是一个更新。我使用firefox在本地保存了页面,我尝试从文件的内容创建一个汤对象。这就是BeautifulSoup失败的地方。如果我尝试直接从网站创建一个汤对象,它就会起作用。Here's导致汤麻烦的文件。

3 个答案:

答案 0 :(得分:5)

使用BeautifulSoup 3.0.7版为我工作得很好。最新的是3.1.0,但是如果你遇到麻烦,可以在BeautifulSoup主页上注意尝试3.0.7a。我想我和你的问题遇到了类似的问题并且还原了,这解决了问题;我试试看。

如果您想坚持使用当前版本,我建议删除顶部的大<script>块,因为这是发生错误的地方,因为无论如何都无法使用BeautifulSoup解析该部分。

答案 1 :(得分:1)

根据我的经验,BeautifulSoup不是容错的。我不得不使用它一次用于一个小脚本并遇到这些问题。我认为使用正则表达式来删除标签有点帮助,但我最终放弃并将脚本移动到Ruby和Nokogiri。

答案 2 :(得分:1)

问题似乎是 contents = contents.replace(/</g, '&lt;');
 在258行加上类似的 contents = contents.replace(/>/g, '&gt;');
 在下一行。

我只是使用re.sub来破坏所有出现的r“替换(/ [&lt;&gt;] /”之前带有一些无害的东西,然后再将它送到BeautifulSoup ...离开BeautifulSoup就像扔掉了宝贝,洗澡水恕我直言。