Python 为什么BeautifulSoup抛出这个HTMLParseError?

Python 为什么BeautifulSoup抛出这个HTMLParseError?,python,exception,parsing,beautifulsoup,malformed,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\Be

我原以为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将页面保存在本地,并尝试从文件内容创建一个soup对象。这就是BeautifulSoup失败的地方。如果我尝试直接从网站创建一个soup对象,它会起作用。给soup带来麻烦的文档。

以我的经验,BeautifulSoup并没有那么容错。我不得不用它编写一个小脚本,结果遇到了这些问题。我认为使用正则表达式去除标记有点帮助,但我最终还是放弃了,将脚本转移到Ruby和Nokogiri上。

根据我的经验,BeautifulSoup并没有那么容错。我不得不用它编写一个小脚本,结果遇到了这些问题。我认为使用正则表达式去除标记有点帮助,但我最终还是放弃了,将脚本转移到Ruby和Nokogiri上。

使用BeautifulSoup 3.0.7版对我来说效果很好。最新版本是3.1.0,但在BeautifulSoup主页上有一条提示,如果您遇到问题,可以尝试3.0.7a。我想我不久前遇到了与你类似的问题,然后又恢复了,这就解决了问题;我想试试


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

使用BeautifulSoup 3.0.7版对我来说效果很好。最新版本是3.1.0,但在BeautifulSoup主页上有一条提示,如果您遇到问题,可以尝试3.0.7a。我想我不久前遇到了与你类似的问题,然后又恢复了,这就解决了问题;我想试试


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

问题似乎是 contents=contents.replace//g; 在下一行


我只需要使用re.sub将所有出现的rreplace/[]/用一些无关紧要的东西进行筛选,然后再将其添加到BeautifulSoup。。。离开BeautifulSoup就像把婴儿连同洗澡水一起扔掉一样。

问题似乎在于 contents=contents.replace//g; 在下一行


我只需要使用re.sub将所有出现的rreplace/[]/用一些无关紧要的东西进行筛选,然后再将其添加到BeautifulSoup。。。离开BeautifulSoup就像把婴儿连同洗澡水一起扔掉一样。

你能给我们看一下文件吗?BeautifulSoup通常非常擅长处理这个问题,尽管错误显示它的HTMLPasser阻塞了。您能给我们看一下文档吗?BeautifulSoup通常非常擅长处理这个问题,尽管错误显示它的HTMLPasser令人窒息。是的,它将接受你对它的任何攻击。使用lxml,它远远优于BeautifulSoup,而且速度更快。它处理坏的HTML。我认为这个评论已经过时了;看起来BS使用的是lxml,Beautiful Soup位于lxml和html5lib等流行Python解析器之上,允许您尝试不同的解析策略,或以速度换取灵活性。是的,它需要您投入的一切。使用lxml,它远远优于BeautifulSoup,而且速度更快。它处理坏的HTML。我认为这个评论已经过时了;看起来BS使用的是lxml,BeautifulSoup位于流行的Python解析器(如lxml和html5lib)之上,允许您尝试不同的解析策略或以速度换取灵活性。问题在于你所说的那一行的正则表达式。它应该是用而不是,或者更好的是,放在它自己的.js文件中编写的,但它不是。HTMLParser似乎无法处理它,而BeautifulSoup 3.0.7中的SGMLParser可以处理它。今天,您应该查看BeautifulSoup 3.2.0版,这是最好的选择。。。根据作者的说法,几乎所有人都是如此。它为我修复了3.1.0中的类似问题,并通过常见的pip/easy_install.Seconding提供。问题在于你所说的那一行的正则表达式。它应该是用而不是,或者更好的是,放在它自己的.js文件中编写的,但它不是。HTMLParser似乎无法处理它,而BeautifulSoup 3.0.7中的SGMLParser可以处理它。今天,您应该查看BeautifulSoup 3.2.0版,这是最好的选择。。。根据作者的说法,几乎所有人都是如此。它为我修复了3.1.0中的类似问题,并可通过通常的pip/easy_安装获得。