Получение AttributeError: объект 'NoneType' не имеет атрибута 'strip' при чтении XML - PullRequest
0 голосов
/ 20 июня 2020

Я читаю XML и добавляю содержимое xml в словарь, но получаю AttributeError: объект 'NoneType' не имеет атрибута 'strip' всякий раз, когда есть пустые теги.

a. xml

<?xml version="1.0"?>
<?xml-stylesheet href="population.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<population>
   <human description="male" product_image="male.jpg">
      <gender sex="Men">
         <id_number>RRX9856</id_number>
         <weight></weight>
      </gender>     
   </human>
</population>

Код: всякий раз, когда этот код выполняется, он выдает ошибку упомянутого атрибута, поскольку есть пустые теги, т.е. x.text () - None.

from lxml import etree
from collections import defaultdict

root_1 = etree.parse('a.xml').getroot()

d1 = []
for node in root_1.findall('.//human '):
    item = defaultdict(list)
    for x in node.iter():
        if x.attrib:
            item[x.attrib.keys()[0]].append(x.attrib.values()[0])
        if x.text.strip():
            item[x.tag].append(x.text.strip())
    d1.append(dict(item))



d1 = sorted(d1, key = lambda x: x['gender'])
print(d1)

Решение, которое я пробовал:

Я читаю выше XML и заменяю пустое значение между тегами на None, используя приведенный ниже код и сохраняя его в каком-то другом b. xml. Но это двойная работа, когда я читаю исходный файл a. xml, а затем заменяю пустые значения строкой None, а затем сохраняю их в b. xml, а затем читаю новый файл xml.

"%s" % x.text()

Есть ли какое-либо другое решение, которое может справиться с этой ошибкой только в исходном XML, и не возникнет проблем при чтении этого XML, и все элементы, включая пустые значения, также могут быть извлечены в результатах?

1 Ответ

1 голос
/ 20 июня 2020

Если все, что вы хотите сделать, это игнорировать любые элементы x, где x.text равно None, то измените строку

        if x.text.strip():

на

        if x.text and x.text.strip():

Однако , если вы хотите, чтобы были включены None элементы, но не пустые элементы (и я не знаю, зачем вам это нужно), вероятно, проще всего заменить строки

        if x.text.strip():
            item[x.tag].append(x.text.strip())

на

        if x is None:
            item[x.tag].append(None)
        elif x.text.strip():
            item[x.tag].append(x.text.strip())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...