【问题标题】:lxml.etree.XMLSyntaxError: htmlParseEntityRef: expecting ';'lxml.etree.XMLSyntaxError:htmlParseEntityRef:期待';'
【发布时间】:2011-12-29 05:56:14
【问题描述】:

我正在尝试找出 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>

我现在收到此错误:

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

文件“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 栏

原点错误:

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

文件“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 的教程,所以我很困惑。会不会是安装问题?

【问题讨论】:

  • 这是您正在解析的实际 HTML 吗?如果您使用 E 构建器构建相同的 HTML 会发生什么?
  • 这不是实际的 html,为了简洁起见,我将其替换为 '...'
  • 它看起来在真正的解析错误上失败了。如果你有简单的 HTML,它会成功吗?
  • 你是对的。琐碎的 HTML 确实可以通过。我已经相应地更新了这个问题。不过,这甚至没有让我觉得 HTML 结构很差?

标签: python lxml


【解决方案1】:

问题在于 HTML 格式错误。要解决此问题,您可以使用BeautifulSoup(它能够解析此 HTML)或在尝试解析 HTML 之前对其进行清理。

我发现的问题是:

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

【讨论】:

  • 谢谢。我使用的是 BeautifulSoup,然后我切换到 lxml,因为我读到它可以更好地处理大文件,因为它支持迭代解析。我现在有一个带有 lxml 的 BeautifulSoup 界面,所以也许我会尝试看看那里
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2021-06-16
    相关资源
    最近更新 更多