lxml.etree.XML语法错误:htmlParseEntityRef:期待';
我正在尝试了解Python的lxml库,但遇到了一个奇怪的问题。我安装了以下版本的库:
- libxml2 : 2.7.8
- libxslt : 1.1.26
当我运行以下代码时:
html = open('file.html', 'r')
context = etree.iterparse(StringIO(html), events=("start", "end"), html='true')
for event, element in context:
#do stuff
编辑:
结果发现这是一个解析错误。我把HTML内容移到了一个文件里(如下所示)
<html>
<head></head>
<body>
<table>
<tr>
<td>image</td>
<a href="relative.phtml?with=querystring&blah=blah">blah\n(blah)</a></td>
<td> 35 </td>
<td> 28 </td>
<td><b>-7</b></td>
<td>
23,000 </td>
<td> 373,000 </td>
<td> 644,000 </td>
<td>+72.65%</td>
</tr>
<tr>
<td>image</td>
<td><a href="relative.phtml?with=querystring&blah=blah">blah\n(blah)</a></td>
<td> 35 </td>
<td> 28 </td>
<td><b>-7</b></td>
<td>
23,000 </td>
<td> 373,000 </td>
<td> 644,000 </td>
<td>+72.65%</td>
</tr>
</table>
</body>
</html>
现在我遇到了这个错误:
for event, element in context:
文件 "iterparse.pxi",第 515 行,在 lxml.etree.iterparse.next (src/lxml/lxml.etree.c:86484) 文件 "parser.pxi",第 565 行,在 lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64084) lxml.etree.XMLSyntaxError: 解析属性名称时出错,第 1 行, 第 12 列
原始错误:
for event, element in context:
文件 "iterparse.pxi",第 515 行,在 lxml.etree.iterparse.next (src/lxml/lxml.etree.c:86484) 文件 "parser.pxi",第 565 行,在 lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64084) lxml.etree.XMLSyntaxError: htmlParseEntityRef: 期待 ';',第 7 行, 第 71 列
我觉得我很仔细地按照lxml的网站上的教程来做,所以我很困惑。这可能是安装的问题吗?
2 个回答
lxml的iterparse
无法解析损坏的HTML。如果你有一个非常大的文件,或者内存有限,你可以像这个回答中提到的那样,自己写一个解析器。但如果你可以把整个树结构存到内存里,那么你可以使用lxml.html
,它比BeautifulSoup
要快。
问题在于这个HTML代码格式不正确。要解决这个问题,你可以使用BeautifulSoup(它可以解析这种HTML),或者在尝试解析之前先清理一下HTML。
我发现的问题有:
- 在链接中,&符号应该用HTML实体来表示:
&
应该写成&
- 第一个标签后面的td结束标签需要去掉,因为它没有对应的开始
标签。 撰写回答