考虑以下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上也得到了支持。
答案 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解析,请使用BeautifulSoup或lxml。
修改强>
回答有关错误的具体问题:
它似乎与issue 13358中报告的错误有关,其修复程序应包含在下一版本的Python 2.7和3.2中。
(我仍坚持上述陈述; - )