Вопрос-Ответ

How to parse XML and get instances of a particular node attribute?

Как проанализировать XML и получить экземпляры определенного атрибута узла?

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

<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>

Как мне получить доступ к значениям атрибута foobar? В этом примере я хочу "1" и "2".

Переведено автоматически
Ответ 1

Я предлагаю ElementTree. Существуют и другие совместимые реализации того же API, такие как lxml, и cElementTree в самой стандартной библиотеке Python; но в данном контексте они в основном добавляют еще больше скорости - простота программирования зависит от API, который ElementTree определяет.

Сначала создайте экземпляр элемента root из XML, например, с помощью функции XML или путем синтаксического анализа файла с помощью чего-то вроде:

import xml.etree.ElementTree as ET
root = ET.parse('thefile.xml').getroot()

Или любым из множества других способов, показанных на ElementTree . Затем сделайте что-то вроде:

for type_tag in root.findall('bar/type'):
value = type_tag.get('foobar')
print(value)

Вывод:

1
2
Ответ 2

minidom самый быстрый и довольно простой способ.

XML:

<data>
<items>
<item name="item1"></item>
<item name="item2"></item>
<item name="item3"></item>
<item name="item4"></item>
</items>
</data>

Python:

from xml.dom import minidom

dom = minidom.parse('items.xml')
elements = dom.getElementsByTagName('item')

print(f"There are {len(elements)} items:")

for element in elements:
print(element.attributes['name'].value)

Вывод:

There are 4 items:
item1
item2
item3
item4
Ответ 3

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

from bs4 import BeautifulSoup

x="""<foo>
<bar>
<type foobar="
1"/>
<type foobar="
2"/>
</bar>
</foo>"""


y=BeautifulSoup(x)
>>> y.foo.bar.type["foobar"]
u'1'

>>> y.foo.bar.findAll("type")
[<type foobar="1"></type>, <type foobar="2"></type>]

>>> y.foo.bar.findAll("type")[0]["foobar"]
u'1'
>>> y.foo.bar.findAll("type")[1]["foobar"]
u'2'
Ответ 4

Существует множество вариантов. cElementTree отлично смотрится, если речь идет о скорости и использовании памяти. У него очень мало накладных расходов по сравнению с простым чтением в файле с помощью readlines.

Соответствующие показатели можно найти в таблице ниже, скопированной с веб-сайта cElementTree:

library                         time    space
xml.dom.minidom (Python 2.1) 6.3 s 80000K
gnosis.objectify 2.0 s 22000k
xml.dom.minidom (Python 2.4) 1.4 s 53000k
ElementTree 1.2 1.6 s 14500k
ElementTree 1.2.4/1.3 1.1 s 14500k
cDomlette (C extension) 0.540 s 20500k
PyRXPU (C extension) 0.175 s 10850k
libxml2 (C extension) 0.098 s 16000k
readlines (read as utf-8) 0.093 s 8850k
cElementTree (C extension) --> 0.047 s 4900K <--
readlines (read as ascii) 0.032 s 5050k

Как указано @jfs, cElementTree поставляется в комплекте с Python:


  • Python 2: from xml.etree import cElementTree as ElementTree.

  • Python 3: from xml.etree import ElementTree (ускоренная версия C используется автоматически).

2023-03-26 04:40 python