2016-05-03 2 views
1

Das ist meine xml Datei:Wie mit einer XML-Datei lesen und unterschreiben

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE papers> 
<papers> 
    <paper> 
    <title>Title containing & and more</title> 
    </paper> 
</papers> 

Wie lese ich, dass die Verwendung lxml ‚s etree? Ich habe versucht,

from lxml import etree 

with open(xml_file, 'r') as inf: 
    tree = etree.parse(inf) 

aber es ergibt sich folgende Traceback:

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "lxml.etree.pyx", line 3239, in lxml.etree.parse (src/lxml/lxml.etree.c:69955) 
    File "parser.pxi", line 1769, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:102257) 
    File "parser.pxi", line 1789, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:102516) 
    File "parser.pxi", line 1684, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:101442) 
    File "parser.pxi", line 1134, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:97069) 
    File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:91275) 
    File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:92461) 
    File "parser.pxi", line 622, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:91757) 
lxml.etree.XMLSyntaxError: xmlParseEntityRef: no name, line 5, column 30 
+0

Ich lief Ihre XML-Datei durch ** xmllint ** und bekam Fehler direkt beim kaufmännischen Und. Das bedeutet, dass Ihr XML fehlerhaft ist. –

+1

Escape mit '&' – Ian2thedv

+0

Ich kann die Datei nicht ändern. – MERose

Antwort

4

Wenn Sie den & Charakter beibehalten müssen, können Sie die Datei als HTML analysieren kann.

from lxml import html 
tree = html.parse(path) 

Wenn Sie nicht brauchen die & Charakter, können Sie einen neuen XML-Parser erstellen und die recover=True Option übergeben.

from lxml import etree 
parser = etree.XMLParser(recover=True) 
tree = etree.parse(path, parser=parser) 
2

Da die XML-Datei fehlerhaft ist, weil der ampersand (vordefinierten XML-Entity) verwenden BeautifulSoup wenn Sie können. Es ist ein fehlertoleranter Parser.

from bs4 import BeautifulSoup 
soup = BeautifulSoup(data) 
print soup.find("title").text 

Ausgänge

Title containing & and more 
Verwandte Themen