【问题标题】:Why is BeautifulSoup throwing this HTMLParseError?为什么 BeautifulSoup 会抛出这个 HTMLParseError?
【发布时间】:2010-11-09 20:17:33
【问题描述】:

我认为 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 导致汤问题的文档。

【问题讨论】:

  • 你能把文件给我们看看吗? BeautifulSoup 通常很擅长处理这个问题,尽管错误表明它的 htmlparser 令人窒息。

标签: python exception parsing beautifulsoup malformed


【解决方案1】:

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

我只是使用 re.sub 将所有出现的 r"replace(/[]/" 用一些无害的东西喂给 BeautifulSoup ... 离开 BeautifulSoup 就像把婴儿扔出去一样洗澡水恕我直言。

【讨论】:

    【解决方案2】:

    使用 BeautifulSoup 3.0.7 版对我来说效果很好。最新的是 3.1.0,但是如果遇到问题,BeautifulSoup 主页上有一条说明可以尝试 3.0.7a。我想我前段时间遇到了与您类似的问题并恢复,从而解决了问题;我会试试的。

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

    【讨论】:

    • 第二。问题在于您正在谈论的那一行上的正则表达式。它应该写成“<”而不是“" (或者,更好的是,放入它自己的 .js 文件中),但事实并非如此。似乎 HTMLParser 无法处理它,而 BeautifulSoup 3.0.7 中的 SGMLParser 可以。
    • 今天,您应该查看 BeautifulSoup 3.2.0 版,根据作者的说法,它“几乎是所有人的最佳选择......”。它为我修复了 3.1.0 中的类似问题,可通过通常的 pip/easy_install 获得。
    【解决方案3】:

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

    【讨论】:

    • 是的,无论你扔什么,它都会受到影响。
    • 使用lxml,它远胜BeautifulSoup,而且速度更快。它处理损坏的 HTML。
    • 我认为这条评论已经过时了;看起来BS使用lxml。 From their site, Beautiful Soup sits on top of popular Python parsers like lxml and html5lib, allowing you to try out different parsing strategies or trade speed for flexibility.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多