我正在使用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。
有人知道为什么切片之后突然发出一个完全不同的错误?最重要的是,是否有人知道如何解决这个问题?
答案 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.'