python类HTMLParser错误地给出了解析错误

时间:2011-12-24 20:12:42

标签: python regex

考虑以下html输入:

<html>
<head>
<script>
function open_tools(tool_div)
{
  document.getElementById("tool1").innerHTML = "<a href='javascript:void(0);' onclick=\"javascript:clos_tools('""');\"><img src='menu.gif' border='0' /></a>";
  document.getElementById("tool").innerHTML  = "<a href='javascript:void(0);' onclick=\"javascript:open_tools('""');\"><img src='plus.gif' border='0' /></a>";
}
</script>
</head>
<body /> 
</html>

为了快速测试,假设您将此html数据转储到'test.html' 在python shell上,

>>> f = open('test.html', 'r')
>>> data = f.read()
>>> from HTMLParser import HTMLParser
>>> p = HTMLParser()
>>> p.feed(data)

Burrrppp ...有以下错误

  File "lib\HTMLParser.py", line 155, in goahead
    k = self.parse_starttag(i)   File "lib\HTMLParser.py", line 235, in parse_starttag
    endpos = self.check_for_whole_start_tag(i)   File "lib\HTMLParser.py", line 319, in check_for_whole_start_tag
    self.error("malformed start tag")   File "lib\HTMLParser.py", line 115, in error
    raise HTMLParseError(message, self.getpos()) HTMLParseError: malformed start tag, at line 7, column 88

过去6个小时我对此错误感到困惑。这是我在 HTMLParser.py 代码中找到的内容:

解析时,遇到脚本标记时,会设置cdata = true。 之后,它使用interesting_cdata= re.compile(r'<(/|\Z)')正则表达式查找脚本标记的结尾[在goahead()内部]

不幸的是,似乎是在</a>的第一个语句的function open_tools而不是</script>找到了脚本标记的结尾。然后它在第二行功能中出现。

我不知道如何解决这个问题,并且想到HTMLParser中的错误是令人不安的。有人可以帮忙吗?

注意:我是一名python业余爱好者并且使用python 2.6(windows)进行了测试

编辑:是的,它适用于BeautifulSoup。但我有兴趣知道正则表达式是否被破坏(以及如何?及其修复)或HTMLParser类的其他问题。在库代码的第一步陷入困境令人沮丧。关于php docs的好处是能够在官方文档页面上发表评论。同样在msdn上也得到了支持。

2 个答案:

答案 0 :(得分:4)

  

似乎是在第一个语句的</a>中找到了脚本标记的结尾

是的,根据HTML4标准这样做是正确的。

在HTML&lt; 5(以及继承此行为的SGML)中,<script><style>等CDATA元素以</(ETAGO)序列结束。该序列不是匹配的结束标记的一部分是错误的。

因此要验证为HTML4,必须确保脚本块中不包含</个序列。 (如果它是您自己的代码,最简单的方法是将它们写为JS字符串文字转义符,如<\/\x3C/。但如果它是您自己的代码,您将需要查看使用DOM方法相反,避免所有逃避问题。)

在HTML5中,这被更改,以便只有匹配的结束标记结束CDATA块。这更符合传统的浏览器行为。如果你使用像html5lib这样的HTML5解析器,你就可以了。

答案 1 :(得分:2)

HTMLParser模块docs的标题说明了一切:

  

HTMLParser - 简单的HTML和XHTML解析器

“简单”的确意味着简单

如果您想进行任何严格的html解析,请使用BeautifulSouplxml

修改

回答有关错误的具体问题:

它似乎与issue 13358中报告的错误有关,其修复程序应包含在下一版本的Python 2.7和3.2中。

(我仍坚持上述陈述; - )