AttributeError: объект «NoneType» не имеет атрибута «кодировать» с помощью lxml-python

Я получаю ошибку AttributeError: 'NoneType' object has no attribute 'encode' при анализе некоторых данных изобретателя патента XML. Я пытаюсь вывести первого изобретателя и его адресную информацию в строку, как показано ниже:

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)

но есть проблема, так как в этом длинном xml есть UnicodeEncodeError: 'ascii' codec can't encode character для нескольких частей. Мне нужно иметь .encodes в моем питоне, чтобы я не создавал ошибку, но при этом я получаю это:

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'

Можно ли вообще игнорировать значения «Нет», которые возвращаются, когда ничего нет? Должен ли я def или использовать другой тип .encode для моего print?

Кстати, я создаю базу данных из входного файла, на самом деле это несколько файлов XML, добавляемых к одному файлу. (Файл данных получен из патентов Google).


person Hola Sir    schedule 28.03.2012    source источник


Ответы (1)


Всегда можно было сделать быстро и грязно str(inventor1.encode("UTF-8") if inventor1 else inventor1)

person Silas Ray    schedule 28.03.2012
comment
Я ошибся в следующей строке, которая является inventors2 = str(inventor3.encode("UTF-8")) + ", " + str(inventor4). Могу я изложить ваше предложение как таковое для str(inventor4 if inventor4 else inventor4) ? Будет ли это работать? - person Hola Sir; 28.03.2012
comment
Ну, там это не имело бы смысла, так как вы сказали бы, если бы еще а, и всегда получили бы а. Есть только точка x, если y иначе z, если x и z разные. Проблема в следующей строке в любом случае не в изобретатель4, я бы поспорил, что это тот же вызов кодирования для изобретателя2. И для этого вы можете снова использовать x, если y, иначе z. Однако более важный вопрос здесь заключается в том, почему вы не делаете все это просто в каком-то цикле. - person Silas Ray; 28.03.2012
comment
Эй, ваше право - я получил его на работу. Я просто поместил их в .encodes, как вы сказали для inventors2. Причина, по которой я делаю это таким образом, заключается в следующем: а) мой босс хочет, чтобы я производил данные таким образом, чтобы он мог понять, и б) я также ограничен в своих знаниях о питоне, и этот метод, хотя и грубый, позволяет мне собирать все, что мне нужно, когда я разбираю. Спасибо за полезный ответ +1 - person Hola Sir; 28.03.2012