lxml.etree.XMLSyntaxError:htmlParseEntityRef:expecting';'

时间:2011-12-29 05:56:14

标签: python lxml

我正在试图找出python lxml api,但遇到了一个特殊的问题。我安装了以下库版本:

  • 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,context in context:

     

文件“iterparse.pxi”,第515行,位于lxml.etree.iterparse。下一步   (src / lxml / lxml.etree.c:86484)文件“parser.pxi”,第565行,   lxml.etree._raiseParseError(src / lxml / lxml.etree.c:64084)   lxml.etree.XMLSyntaxError:解析属性名称的错误,第1行,   第12栏

ORIGIN ERROR:

  

for event,context in context:

     

文件“iterparse.pxi”,第515行,位于lxml.etree.iterparse。下一步   (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的site教程,所以我很困惑。这可能是安装问题吗?

2 个答案:

答案 0 :(得分:7)

问题是HTML格式不正确。要解决此问题,您可以使用BeautifulSoup(它能够解析此HTML)或在尝试解析HTML之前清理HTML。

我发现的问题是:

  • &ampersand应作为链接中的HTML实体进行转义:& =&gt; &amp;
  • 必须删除第一个td代码后关闭a代码,因为它与任何其他开放td代码都不匹配。

答案 1 :(得分:4)

lxml iterparse无法解析损坏的html。如果你有一个非常大的文件或内存限制,你可以编写自己的解析器,如this answer。但是,如果允许将整个树存储到内存中,则可以使用比lxml.html更快的BeautifulSoup