2016-03-22 7 views
0

私はxmlを解析するためにPython lxmlライブラリを使用していますが、特定のテキストを解析するのは苦労しています。次のコードをチェックアウト:なぜPython lxmlは私のXMLをとらないのですか?

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

それは、XMLの前で3つの変な文字があります。

>>> 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 

ので、最初の文字が検査によって真である、<ではないと言います。

>>> 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文字列であることについて不平を言う:だから、私は次のことを試してみましたこれらをきれいにします一緒に。

誰もがスライスした後に突然全体的に異なるエラーを表示する理由を知っていますか?そして、最も重要なのは、誰かが私がこれをどのように解決できるかを知っていますか?

+1

xml plsを追加してください。 –

答えて

3

why after slicing it suddenly gives a whole different error?

スライス後に最初のエラーが消滅し、2番目のエラーが見つかるまで解析が進行する可能性があるためです。

And most importantly, does anybody know how I can solve this?

多分エラーメッセージが正しいです(起こります)、ユニコードをバイトに変換することで解決できるかもしれません。私はそれがエンコード宣言を削除するよりも良いと思います。 XMLフラグメントで宣言されているどのような符号化

raw_text_xml.encode('utf8') 

又はその代わりの'utf8'

+0

音が合法です。バイトに変換するための提案がありますか? – kramer65

+0

私は 'etree.fromstring(bytearray(raw_text_xml [3:])、parser)'を試しましたが、これは 'TypeError:unicode引数にエンコーディングなし 'を与えます。何か案は? – kramer65

+0

私の編集を参照してください。 'bytearray'は別のものです。 Python 2では 'bytes'は' str'のエイリアスです。 – Goyo

1

最初のエラーは間違った文字が原因です。あなたが固定したら、あなたはraw_text_xmlがユニコードであるということになります。

は、適切なエンコーディング(ASCII、latin1、utf8、...)がわかります。私は実際の内容を見ることができない。

あなたが行うことができるはず、それはencoding変数の内容であると仮定すると:(...しかし、私は強くprint raw_text_xml[3:160]を示してどのような第一の制御にあなたをアドバイス)

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

今まであなた
0

元のUnicodeをデコードしたが、間違っていた。 iso-8859-2のように見えますが、もともとはBOM署名付きのUTF-8でした。以下は正しくないデコードを取り除き、正しく再デコードします:

>>> s.encode('iso-8859-2').decode('utf-8-sig') 
'<?xml version="1.' 
関連する問題