众所周知,XML文档中不允许使用某些字符范围 我知道过滤掉这些字符的解决方案(如[1][2] )。

遵循不要重复自己的原则,我宁愿在一个中心点实现其中一个解决方案 - 现在,我必须在将任何可能不安全的文本提供给lxml之前清理它们。 有没有办法实现这一点,例如通过lxml过滤器类,捕获一些异常或设置配置开关?


编辑:希望有点澄清这个问题,这里是一个示例代码:

from lxml import etree

root = etree.Element("root")
root.text = u'\uffff'
root.text += u'\ud800' 

print(etree.tostring(root))

root.text += '\x02'.decode("utf-8")

执行此操作会得到结果

<root>&#65535;&#55296;</root>

Traceback (most recent call last):
  File "[…]", line 9, in <module>
    root.text += u'\u0002'
  File "lxml.etree.pyx", line 953, in lxml.etree._Element.text.__set__ (src/lxml/lxml.etree.c:44956)
  File "apihelpers.pxi", line 677, in lxml.etree._setNodeText (src/lxml/lxml.etree.c:20273)
  File "apihelpers.pxi", line 1395, in lxml.etree._utf8 (src/lxml/lxml.etree.c:26485)
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters

如您所见,2字节抛出异常,但lxml很高兴地逃避了另外两个超出范围的字符。 真正的麻烦在于

s = "<root>&#65535;&#55296;</root>"
root = etree.fromstring(s)

也抛出一个例外。 在我看来,这种行为有点令人不安,特别是因为它产生了无效的XML文档。


事实证明,这可能是一个2比3的问题。 使用python3.4,上面的代码抛出异常

Traceback (most recent call last):
  File "[…]", line 5, in <module>
    root.text += u'\ud800'
  File "lxml.etree.pyx", line 953, in lxml.etree._Element.text.__set__ (src/lxml/lxml.etree.c:44971)
  File "apihelpers.pxi", line 677, in lxml.etree._setNodeText (src/lxml/lxml.etree.c:20273)
  File "apihelpers.pxi", line 1387, in lxml.etree._utf8 (src/lxml/lxml.etree.c:26380)
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud800' in position 1: surrogates not allowed

唯一剩下的问题是\￿字符, lxml仍然乐意接受。

===============>>#1 票数:1

只需在LXML中解析字符串之前过滤字符串: 从XML清除无效字符(由lawlesst提供)

我用你的代码试了一下; 它似乎工作,除了你需要更改要点导入resys的事实!

from lxml import etree
from cleaner import invalid_xml_remove

root = etree.Element("root")
root.text = u'\uffff'
root.text += u'\ud800' 

print(etree.tostring(root))

root.text += invalid_xml_remove('\x02'.decode("utf-8"))

  ask by Percival Ulysses translate from so

未解决问题?本站智能推荐:

2回复

使用python和lxml忽略xml中的unicode?

我想忽略我的xml中的unicode。 我愿意以某种方式在输出处理中进行更改。 我的python: 创建以下内容的输出: 但是,如果我尝试重新添加'-'join(target).replace('\\n-','') ,则对于print和outFile.write都会出现此
1回复

lxml unicode实体解析问题

我使用lxml如下来分析从另一个系统导出的XML文件: 但即时通讯: lxml.etree.XMLSyntaxError:未定义实体“ eacute”,行4495,第46列 显然,Unicode实体名称存在问题-但是我将如何解决呢? 通过open()还是parse()
1回复

使用lxml通过Unicode编码检索标签和子标签类别

我试图将Collections.counter与lxml一起使用以对xml文件中的所有名词和形容词进行计数,其中名词和形容词标签的编写方式如下: 其中tag =“ NN”表示一个名词。 我只想将它们取出,然后将它们添加到计数器中,但是这样做很难。 我目前可以提取所有单词并对其进行计数
1回复

从Unicode字符串创建xml节点(不支持编码声明)?

我有一个数据库字段,它将XML文档存储为Unicode。 但是,当我获取字段并尝试启动lxml节点时,出现以下错误: 我当前拥有的文本( self.xml )包含日语字符等。如何创建节点?
2回复

使用lxml用日语解析xml

我有以下xml文档: 我正在使用lxml来解析标题,如下所示: 但是,当我使用title.encode(utf-8) INSERT到数据库中时,出现乱码: セレニティー (å—幕版) 我将如何在此处正确解析title (セレニティー(字
1回复

编写lxml文本时出现ValueError

我有以下代码块来编写xml标签。 有时名称已经采用正确的格式(即不会出错),有时名称却不正确 有没有一种方法可以简化此过程? 例如,类似以下内容的东西:
3回复

为什么Python lxml不使用我的xml?

我正在使用Python lxml库来解析我的xml,但是在解析一个特定文本时遇到了困难。 签出以下代码: 因此它说第一个字符不是< ,通过检查,它是正确的: 它在xml前面有3个奇怪的字符。 因此,为了清洁这些,我尝试了以下操作: 现在,它突然抱怨它是带有编码声
4回复

过滤掉python中的某些字节

我在我的python程序中收到此错误: ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters 这个问题, 来自/ dev / random的
2回复

正则表达式匹配无效的Unicode字符

我有这样的字符串: ꐊ,ꀵ,\཮,ⴗ,ꦚ,\⵵,ꢯ,⾌,\꥽,⩱,ㇴ,\⵮,鼺,\\x00Ꞁ 我想过滤掉所有这些以斜杠开头的无效字符,我正尝试使用Python中的正则表达式进行过滤。 它确实像这样工作: 但不是这样的: 它应该可以根据http://pythex.org
1回复

名称中带有unicode的标签,以及lxml

假设我有一个在标签名称中使用Unicode的文档,例如<año>2012</año> 。 当我使用来自lxml的etree解析此类文档时,我没有问题,树已正确构建。 但是,当(出于调试目的)我尝试打印一些元素时,出现了关于将某些unichar字符编码为ASCII的