2016-03-22 13 views
0

Ich benutze die Python lxml-Bibliothek, um meine XML zu parsen, aber ich habe es schwer, einen bestimmten Text zu analysieren. Kasse den folgenden Code:Warum nimmt Python lxml meine XML nicht?

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

so sagt es das erste Zeichen kein < ist, die durch Inspektion gilt:

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

es hat 3 seltsame Zeichen vor dem xml. So zu reinigen diese Ich habe versucht, die folgenden:

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

Und jetzt ist es beschwert sich plötzlich über sie ein Unicode-String mit Kodierungsdeklaration zu sein, während, wenn Sie den ganzen Weg sehen, um meine erste Zeile des Codes, es war Unicode alle eine lange.

Weiß jemand, warum nach dem Schneiden plötzlich einen ganz anderen Fehler gibt? Und am wichtigsten, weiß jemand, wie ich das lösen kann?

+1

Fügen Sie Ihre XML-Datei hinzu. –

Antwort

3

Da nach dem Slicing der erste Fehler verschwindet und das Parsen fortschreiten kann, bis der zweite gefunden wird.

Vielleicht ist die Fehlermeldung richtig (es passiert) und Sie können es lösen, indem Sie den Unicode in Bytes konvertieren. Ich denke, das ist besser, als die Kodierungsdeklaration zu entfernen.

raw_text_xml.encode('utf8') 

Oder statt 'utf8' was Codierung in dem XML-Fragmente deklariert wird.

+0

Klingt echt. Und haben Sie Vorschläge für die Konvertierung in Bytes? – kramer65

+0

Ich versuchte 'etree.fromstring (bytearray (raw_text_xml [3:]), Parser), aber das gibt mir ein' TypeError: unicode Argument ohne eine Kodierung'. Irgendwelche Ideen? – kramer65

+0

Siehe meine Bearbeitung. 'Bytearray' ist eine andere Sache. In Python 2 ist 'Bytes' ein Alias ​​für' str'. – Goyo

1

Der erste Fehler wurde durch falsche Zeichen verursacht. Sobald Sie es behoben haben, fallen Sie in der Sekunde, die ist, dass Ihr raw_text_xml Unicode ist.

Sie können wissen, was eine ordnungsgemäße Codierung sein wird (ASCII, latin1, utf8, ...). Ich kann nicht, ohne den tatsächlichen Inhalt zu sehen.

Unter der Annahme, es der Gehalt an encoding variabel ist, sollten Sie in der Lage zu tun:

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

(aber ich Ihnen dringend raten, zuerst was print raw_text_xml[3:160] zeigt Kontrolle ...)

0

Wo immer Sie den ursprünglichen Unicode entschlüsselt, wurde es falsch gemacht. Es sieht wie iso-8859-2 aus, wo es ursprünglich UTF-8 mit BOM-Signatur war. Im Folgenden wird die fehlerhafte Decodierung zurückgenommen und neu dekodiert:

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