2012-03-28 8 views
0

Ich AttributeError: 'NoneType' object has no attribute 'encode' Fehler bekommen, wenn einige XML-Patent Erfinder Daten Parsen aus. Ich versuche, die ersten Erfinder und ihre Adresse Infomationen in einen String als solche unten zu ziehen:Attribute: ‚NoneType‘ Objekt hat kein Attribut ‚kodieren‘ mit lxml-Python

inventor1 = first(doc.xpath('//applicants/applicant/addressbook/last-name/text()')) 
inventor2 = first(doc.xpath('//applicants/applicant/addressbook/first-name/text()')) 
inventor3 = first(doc.xpath('//applicants/applicant/addressbook/address/city/text()')) 
inventor4 = first(doc.xpath('//applicants/applicant/addressbook/address/state/text()')) 
inventor5 = first(doc.xpath('//applicants/applicant/addressbook/address/country/text()')) 
inventor = str(inventor2.encode("UTF-8")) + " " + str(inventor1.encode("UTF-8")) 
inventors2 = str(inventor3.encode("UTF-8")) + ", " + str(inventor4) + ", " + str(inventor5) 
inventors = str(inventor) + ", " + str(inventors2) 

print "DocID: {0}\nGrantDate: {1}\nApplicationDate: {2}\nNumber of Claims: {3}\nExaminers: {4}\nAssignee: {5}\nInventor: {6}\n".format(docID,grantdate,applicationdate,claimsNum,examiners.encode("UTF-8"),assignees,inventors) 

aber es gibt Problem, da es eine UnicodeEncodeError: 'ascii' codec can't encode character für mehrere Teile in dieser langen xml ist. Ich brauche die .encodes in meinem Python haben, so dass ich nicht einen Fehler erzeugen aber dadurch bekomme ich dies:

Traceback (most recent call last): 
    File "C:\Documents and Settings\Desktop\FINAL BART INFO ONE.py", line 87, in <module> inventor = str(inventor2.encode("UTF-8")) + " " + str(inventor1.encode("UTF-8")) 
AttributeError: 'NoneType' object has no attribute 'encode' 

Gibt es trotzdem, um entweder die „None“ Werte zu ignorieren, die zurückgegeben werden, wenn nichts ist da ? Muss ich def oder eine andere Art von .encode für meine print verwenden?

Durch die Art, wie ich eine Datenbank aus einer Eingabedatei bin Erstellung ist eigentlich mehrere XML-Dateien in eine Datei anhängen. (Datei von Google Patents bezogen).

Antwort

4

Sie können immer nur das tun, quick and dirty str(inventor1.encode("UTF-8") if inventor1 else inventor1)

+0

ich in der nächsten Zeile errored auf sein die 'inventors2 = str (inventor3.encode ("UTF-8")) + "" + str (inventor4) '. Könnte ich Ihren Vorschlag für "str (Erfinder4 wenn Erfinder4 sonst Erfinder4)" als solchen angeben? Würde das funktionieren? –

+0

Naja, da hätte es keinen Sinn, als würdest du sagen, wenn ein anderes ein und immer ein bekommt. Es gibt nur einen Punkt für x, wenn y oder z, wenn x und z verschieden sind. Das Problem in der nächsten Zeile ist sowieso nicht Erfinder4, es ist der gleiche Codieraufruf auf Erfinder2, würde ich wetten. Und dafür können Sie das x wieder verwenden, wenn Sie etwas anderes tun. Die größere Frage hier ist jedoch, warum Sie das alles nicht nur in einer Art Schleife machen. –

+0

Hey dein Recht- ich habe es zur Arbeit gebracht. Ich lege sie einfach auf die .encodes, wie du es für die 'erfinder2 'gesagt hast. Der Grund, warum ich es so mache, ist A) mein Chef möchte, dass ich die Daten auf diese Weise erstelle, damit er es verstehen kann und B) ich bin auch in meinem Wissen über Python und diese Methode eingeschränkt, während es mir Rohheit erlaubt alles was ich brauche, wenn ich analysiere. Danke für die hilfreiche Antwort +1 –

Verwandte Themen