lxml.etree.XML语法错误:htmlParseEntityRef:期待';

3 投票
2 回答
10696 浏览
提问于 2025-04-17 09:11

我正在尝试了解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 个回答

4

lxml的iterparse无法解析损坏的HTML。如果你有一个非常大的文件,或者内存有限,你可以像这个回答中提到的那样,自己写一个解析器。但如果你可以把整个树结构存到内存里,那么你可以使用lxml.html,它比BeautifulSoup要快。

8

问题在于这个HTML代码格式不正确。要解决这个问题,你可以使用BeautifulSoup(它可以解析这种HTML),或者在尝试解析之前先清理一下HTML。

我发现的问题有:

撰写回答