python - 使用 lxml 处理 XML 文档中类似实体的最佳方法是什么?

标签 python lxml

考虑以下几点:

from lxml import etree
from StringIO import StringIO

x = """<?xml version="1.0" encoding="utf-8"?>\n<aa>&nbsp;&acirc;</aa>"""
p = etree.XMLParser(remove_blank_text=True, resolve_entities=False)
r = etree.parse(StringIO(x), p)

这会失败:
lxml.etree.XMLSyntaxError:实体“nbsp”未定义,第 2 行,第 11 列

这是因为 resolve_entities=False 不会忽略它们,只是不会解析它们。

如果我改用 etree.HTMLParser,它会创建 htmlbody 标签,以及它尝试执行的许多其他特殊处理用于 HTML

使用 lxml 在 aa 标签下获取  â 文本子项的最佳方法是什么?

最佳答案

您不能忽略实体,因为它们是 XML 定义的一部分。如果您的文档没有 DTD 或 standalone="yes",或者如果它包含 DTD 中没有实体定义的实体,那么您的文档就是格式不正确的。撒谎并声称您的文档是 HTML。

https://mailman-mail5.webfaction.com/pipermail/lxml/2008-February/003398.html

您可以尝试撒谎并将 XHTML DTD 放在您的文档中。例如

from lxml import etree
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO
x = """<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >\n<aa>&nbsp;&acirc;</aa>"""
p = etree.XMLParser(remove_blank_text=True, resolve_entities=False)
r = etree.parse(StringIO(x), p)
etree.tostring(r) # '<aa>&nbsp;&acirc;</aa>'

关于python - 使用 lxml 处理 XML 文档中类似实体的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170252/

相关文章:

Python:你能在对象引用中使用计算表达式吗?

python - 如何限制 Django admin 中的选择数量

python - 删除节点lxml python

python - 使用lxml库解析dtd文件(python)

python - 主成分分析最重要的原始特征

Python:关闭程序后将数据保存在内存中

javascript - 使用Flask和JQuery,如何在 "POST"方式中通过 "sexy"方法删除一条记录?

python - 将我的 python 脚本从 lxml 转换为 xml.etree

Python 解析嵌套 XML 并扁平化数据

python - 使用 ElementTree/lxml 查找文本字符串的父标签