Обработка пустых значений атрибутов в xml - PullRequest
0 голосов
/ 10 июля 2020

Я печатаю значения XML тегов и атрибутов, присутствующих в них. Если значение любого атрибута или тега пустое, я пытаюсь напечатать None. Я могу сделать это для пустых тегов, но код не печатает None, если есть пустое значение атрибута.

XML (a. xml):

<?xml version="1.0"?>
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
   <product description="Cardigan Sweater" product_image="cardigan.jpg">
      <catalog_item gender="Men's">
         <item_number sep = "help" dep = "paraug" note = "zempu">QWZ5671</item_number>
         <line cap = "delp" des = "" fote = "cat"></line>
         <cool_number>QWZ5671</cool_number>
         <price>39.5</price>
         <price></price>
      </catalog_item>
   </product>
</catalog>

код:

from lxml import etree
from collections import defaultdict

root_1 = etree.parse('a.xml').getroot()
d1= []

for node in root_1.findall('.//catalog_item'):
    item = defaultdict(list)
    for x in node.iter():
        # iterate over the items
        for k, v in x.attrib.items():
            item[k].append(v)
        if x.attrib is None:
          item[x.attrib].append('None')
        if x.text is None:
          item[x.tag].append('None')
        elif x.text.strip():
            item[x.tag].append(x.text.strip())

    d1.append(dict(item))
print(d1)

Текущий вывод: значение атрибута des пусто в XML, следовательно, здесь оно пустое, но в теге строки появляется None

[{'gender': ["Men's"], 'sep': ['help'], 'dep': ['paraug'], 'note': ['zempu'], 'item_number': ['QWZ5671'], 'cap': ['delp'], 'des': [''], 'fote': ['cat'], 'line': ['None'], 'cool_number': ['QWZ5671'], 'price': ['39.5', 'None']}]

Ожидаемый результат: если значение атрибута пустое, то для этого должно быть указано None, как показано для des здесь

[{'gender': ["Men's"], 'sep': ['help'], 'dep': ['paraug'], 'note': ['zempu'], 'item_number': ['QWZ5671'], 'cap': ['delp'], 'des': ['None'], 'fote': ['cat'], 'line': ['None'], 'cool_number': ['QWZ5671'], 'price': ['39.5', 'None']}]```

1 Ответ

2 голосов
/ 10 июля 2020

проблема связана с тем, как вы сейчас тестируете пустые атрибуты:

if x.attrib is None:

это проверяет, есть ли у узла какие-либо атрибуты вообще (x.attrib - это dict, содержащий все атрибуты узлов) . вы можете исправить это, заменив это

for k, v in x.attrib.items():
    item[k].append(v)
if x.attrib is None:
  item[x.attrib].append('None')

на это

for k, v in x.attrib.items():
    item[k].append(v if v else None)  # use str(None) if you really need a string

, что даст следующий результат:

[{'note': ['zempu'], 'item_number': ['QWZ5671'], 'cool_number': ['QWZ5671'], 'cap': ['delp'], 'des': [None], 'sep': ['help'], 'fote': ['cat'], 'dep': ['paraug'], 'line': ['None'], 'price': ['39.5', 'None'], 'gender': ["Men's"]}]
...