l xml не читает открывающие и закрывающие теги XML, когда они находятся в разных строках - PullRequest
1 голос
/ 13 июля 2020

Я использую пакет l xml для чтения тегов и значений атрибутов из XML. Он считывает значения, когда открывающие и закрывающие теги находятся в одной строке, но не читает, когда открывающие и закрывающие теги находятся в разных строках. Ниже XML ценники, например, <price> и </price>, в одной строке и цена, поступающая в выводе

a. xml

<catalog>
   <product description="Cardigan Sweater" product_image="cardigan.jpg">
      <catalog_item gender="Men's">
         <cool_number>QWZ5671</cool_number>
         <price></price>
      </catalog_item>
   </product>
</catalog>

Вывод:

[{'gender': ["Men's"], 'cool_number': ['QWZ5671'], 'price': ['None']}]

Но если ценники и в другой строке, то цена в выводе не появляется

a. xml

<catalog>
   <product description="Cardigan Sweater" product_image="cardigan.jpg">
      <catalog_item gender="Men's">
         <cool_number>QWZ5671</cool_number>
         <price>
         </price>
      </catalog_item>
   </product>
</catalog>

Вывод:

[{'gender': ["Men's"], 'cool_number': ['QWZ5671']}]

Код одинаковый для обоих xmls:

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)

Есть идеи, когда теги и в другой строке, тогда почему ценник не выводится? как это исправить?

1 Ответ

0 голосов
/ 13 июля 2020

ваша проблема связана с этим условием:

if x.text is None:
  item[x.tag].append('None')

вы проверяете, содержит ли тег никакого текста . это имеет место здесь <price></price>, потому что закрывающий тег следует сразу за открывающим тегом. здесь, однако,

...
     <price>
     </price>
...

ваш тег действительно содержит текст: новую строку и некоторые пробельные символы. чтобы исправить это, вам нужно изменить свое состояние с if x.text is None: на что-то вроде if not x.text or not x.text.strip():

...