Python lxml.etree.XMLSyntaxError:htmlParserEntityRef:应为'';

Python lxml.etree.XMLSyntaxError:htmlParserEntityRef:应为'';,python,lxml,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 编辑: 事实证

我试图弄清楚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移动到一个文件(如下所示)


形象
35
28
-7
23,000    
373,000   
644,000   
+72.65%
形象
35
28
-7
23,000    
373,000   
644,000   
+72.65%
我现在得到这个错误:

对于事件,上下文中的元素:

文件“iterparse.pxi”,第515行,在lxml.etree.iterparse中。next (src/lxml/lxml.etree.c:86484)文件“parser.pxi”,第565行,在 lxml.etree.\u raiseParserError(src/lxml/lxml.etree.c:64084) lxml.etree.XMLSyntaxError:分析属性名称时出错,第1行, 第12栏

原点错误:

对于事件,上下文中的元素:

文件“iterparse.pxi”,第515行,在lxml.etree.iterparse中。next (src/lxml/lxml.etree.c:86484)文件“parser.pxi”,第565行,在 lxml.etree.\u raiseParserError(src/lxml/lxml.etree.c:64084) lxml.etree.XMLSyntaxError:htmlParserEntityRef:应为“;”,第7行, 第71栏


我想我在这里非常仔细地学习了lxml的教程,所以我很困惑。可能是安装问题吗?

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

我发现的问题是:

  • 符号应在链接中作为HTML实体转义:
    &
    =>
    &
  • 第一个
    a
    标记后的关闭
    td
    标记必须移除,因为它与任何其他打开
    td
    标记不匹配

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

要分析的是实际的html吗?如果您使用E builder构建相同的HTML会发生什么?这不是实际的HTML,我将其替换为“…”,因为brevityIt看起来在一个真正的解析错误上失败了。如果你有平凡的HTML,它成功了吗?你是对的。琐碎的HTML确实会通过。我已经相应地更新了这个问题。不过,我甚至不觉得这是一个构造糟糕的HTML?谢谢。我使用了BeautifulSoup,然后我切换到lxml,因为我读到它可以更好地处理大文件,因为它支持迭代解析。我现在看到了一个漂亮的lxml接口,所以我可以试试看
<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>