XPath: если ребенок существует - получить значение, если нет - написать пустую строку - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть три типа узлов: без категорий, с одной категорией и несколькими категориями:

<technology>
  <categories>
    <category></category>
  </categories>
  <name></name>
</technologie>    

<technology>
  <name></name>
</technologie>    

<technology>
  <categories>
    <category></category>
    <category></category>
    <category></category>
  </categories>
  <name></name>
</technologie>

Я хочу записать данные с узла technology, например:

  • если есть одна категория - напишите ее,
  • , если категории нет - напишите пустую строку
  • , если имеется несколько категорий - напишите первую.

Я пробовал что-то вроде //technology/*[descendant::category] или //technology/categories/category[1] - но я не могу получить пустую строку , если category не существует, все существующие категории записываются одна за другой.

Как мне получить данные, записанные описанным способом?

1 Ответ

1 голос
/ 18 апреля 2019

Я не знаю, хотите ли вы идти в этом направлении, но, FWIW, вы можете справиться с этим с помощью lxml.Если ваш код:

snip = """
<technology>
  <categories>
    <category>Cat-A</category>
  </categories>
  <name>Nam-1</name>
</technology>    

<technology>
  <name>Nam-2</name>
</technology>    

<technology>
  <categories>
    <category>Cat-B</category>
    <category>Cat-C</category>
    <category>Cat-D</category>
  </categories>
  <name></name>
</technology>
  """

Вы можете использовать:

from lxml import etree
tree = lxml.etree.fromstring(snip, parser=lxml.etree.HTMLParser())

results  =  tree.xpath("*//technology")
for result in results:
    for j in result.getchildren():
        if j.tag == 'categories':
            for m in j.itertext():
                if m.strip() != '':
                    print(m)
                    break
            break
        else:
            print('none')
            break

Выход:

Cat-A
none
Cat-B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...