Ищем синтаксис для обхода всех вложенных тегов в ElementTree.findall () в python - PullRequest
0 голосов
/ 28 мая 2020

Пожалуйста, несите меня, я борюсь с xml и ElementTree от python. Я разместил вопрос: Как использовать Element.findall () для поиска тега и печати его значения. и предоставленное решение работало нормально, однако позже я понял, что namespace был зарегистрирован в теге <parent>. Я понятия не имел, как эта часть данных изменит план игры.

<parent xmlns="http://xmlns.test.com/parent" version="1">

Имея namespace, этот findall('./*/c/d') больше не находит вложенные tag (т.е. c/d). Читая здесь больше тем, я понял, что мне нужно добавить namespace вот так.

def search(root, wordToSearch):
  tags = root.findall('{http://xmlns.test.com/parent}first')
  print tags

Приведенный выше код наверняка найдет тег <first>, однако я надеюсь получить catch all путь что-то вроде (./*/c/d), который будет проходить через тег <first>, затем <second>.

Меня беспокоит, что xml может иметь тег third or even more под <parent> в будущем. Есть ли способ сделать это без использования библиотеки lxml? Кстати, у меня есть и python 2.6.6, и 2.7.18 на rhel сервере. Я запускаю скрипт.

[обновление]

К счастью, я смог найти решение с ElementTree 1.3.

def search(root, wordToSearch):
   for child in root: # child represents first and second tag
     el = child.tag.split('}', 1)[1] # Remove namespace
     el_path = 'xmlns:{0}/xmlns:c/xmlns:d'.format(el)
     target_tags = root.findall(el_path, namespaces={'xmlns': 'http://...'})

1 Ответ

0 голосов
/ 28 мая 2020

У вас работает?

from bs4 import BeautifulSoup

def get_texts(root, tag_name):
    return [tag.get_text() for tag in root.find_all(tag_name)]

soup = BeautifulSoup(open('test.xml').read(), features="lxml")
print(get_texts(soup, 'd'))
print(get_texts(soup, 'f'))

Вывод:

['987', '345']
['xxx', 'yyy', 'zzz', 'ttt', 'hhh', 'www']

Вот пакет: https://pypi.org/project/beautifulsoup4/

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