为什么Python lxml不接受我的xml?

时间:2016-03-22 14:31:53

标签: python xml unicode lxml

我正在使用Python lxml库来解析我的xml,但是我很难解析一个特定的文本。查看以下代码:

>>> print type(raw_text_xml)
<type 'unicode'>
>>> from lxml import etree
>>> article_xml_root = etree.fromstring(raw_text_xml, parser)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    article_xml_root = etree.fromstring(raw_text_xml, parser)
  File "lxml.etree.pyx", line 3032, in lxml.etree.fromstring (src/lxml/lxml.etree.c:68121)
  File "parser.pxi", line 1786, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:102470)
  File "parser.pxi", line 1667, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:101229)
  File "parser.pxi", line 1035, in lxml.etree._BaseParser._parseUnicodeDoc (src/lxml/lxml.etree.c:96139)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:91290)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:92476)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:91772)
XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1

所以它说第一个字符不是<,通过检查是真的:

>>> print raw_text_xml[:20]
ďťż<?xml version="1.

它在xml前面有3个奇怪的字符。所以为了清理这些,我尝试了以下内容:

>>> article_xml_root = etree.fromstring(raw_text_xml[3:], parser)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    article_xml_root = etree.fromstring(raw_text_xml[3:], parser)
  File "lxml.etree.pyx", line 3032, in lxml.etree.fromstring (src/lxml/lxml.etree.c:68121)
  File "parser.pxi", line 1781, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:102435)
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

现在它突然抱怨它是一个带编码声明的unicode字符串,而如果你一直看到我的第一行代码,它一直都是Unicode。

有人知道为什么切片之后突然发出一个完全不同的错误?最重要的是,是否有人知道如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

  

为什么突然切片后会产生完全不同的错误?

因为在切片之后第一个错误消失了,解析可以继续进行,直到找到第二个错误。

  

最重要的是,有人知道如何解决这个问题吗?

可能错误消息是正确的(它发生),你可以通过将unicode转换为字节来解决它。我想这比删除编码声明要好。

raw_text_xml.encode('utf8')

或者代替'utf8'在xml片段中声明的任何编码。

答案 1 :(得分:1)

第一个错误是由错误的字符引起的。一旦你修复它,你就会落后于你的raw_text_xml是unicode。

可以知道什么是正确的编码(ASCII,latin1,utf8,...)。我不能不看到实际的内容。

假设它是encoding变量的内容,您应该能够:

article_xml_root = etree.fromstring(raw_text_xml.encode(encoding), parser)

(但我强烈建议您先控制显示print raw_text_xml[3:160] ...)

的内容

答案 2 :(得分:0)

无论你在哪里解码原始Unicode,它都是错误的。它看起来像iso-8859-2,最初是带有BOM签名的UTF-8。以下内容支持错误解码并正确重新解码:

>>> s.encode('iso-8859-2').decode('utf-8-sig')
'<?xml version="1.'