Форум сайта python.su
0
Доброго времени суток.
Помогите разобраться, нужно из xml разметки в которой огромное количество записей найти и вытянуть <name></name>.
Есть номер id записи он приходит из вне, мне нужно с помощью этого id выдать имя которое находится по этой записи.
Написал часть кода который получает количество записей и выводит первый id, а вот в поиске не могу разобраться((
import re import xml.etree.ElementTree as ET xml_str = '''<?xml version="1.0" encoding="utf-8"?> <orders date="2019-12-16 18:34"> <order id="95457387" state="accepted"> <name>Пупкин Олег Пупкинович</name> <phone>+180660000000</phone> </order> <order id="95403040" state="closed"> <name>Раздолбайкин Александр</name> <phone>+780660000000</phone> </order> </orders>''' tree = ET.ElementTree(ET.fromstring(xml_str)) root = tree.getroot() # общее количество id print('Общее количество id',len(root[0])) #первый id Id = root[0].attrib print('первое id=',Id['id']) #В xml 100500 записей,Как найти по номеру id="95403040" и присвоить # переменной "name" содержимое <name>Раздолбайкин Александр</name> # пытался реализовать с помощью root[0].find, но не могу разобраться((
Офлайн
568
Yuriy_V
Вам помогут XPath запросы
Офлайн
0
FishHookа можно хоть один пример на моем коде?
Вам помогут XPath запросы
Офлайн
568
from lxml import etree xml_str = ''' <orders date="2019-12-16 18:34"> <order id="95457387" state="accepted"> <name>Pupkin Oleg</name> <phone>+180660000000</phone> </order> <order id="95403040" state="closed"> <name>Razdolbaykin Alexander</name> <phone>+780660000000</phone> </order> </orders>''' root = etree.fromstring(xml_str) orders = root.xpath('/orders/order[@id="95403040"]') print orders[0].find('name').text
Офлайн
857
>>> import xml.etree.ElementTree as ET >>> >>> xml_str = '''<?xml version="1.0" encoding="utf-8"?> ... <orders date="2019-12-16 18:34"> ... <order id="95457387" state="accepted"> ... <name>Пупкин Олег Пупкинович</name> ... <phone>+180660000000</phone> ... </order> ... <order id="95403040" state="closed"> ... <name>Раздолбайкин Александр</name> ... <phone>+780660000000</phone> ... </order> ... </orders>''' >>> >>> doc = ET.fromstring(xml_str) >>> >>> nodes = doc.findall('.//order[@id="95403040"]/name') >>> >>> out = [i.text for i in nodes] >>> out ['Раздолбайкин Александр'] >>>
Отредактировано py.user.next (Дек. 17, 2019 11:44:30)
Офлайн
0
Огромное спасибо. Благодаря Вам, на этом этапе разобрался, ищет по id прекрасно и записывает в переменную эти имена.
Но когда структура xml начинает расширятся сразу возникают ошибки по синтаксису написания.Не хватает моего опыта в Python-e
Помогите разобраться на примере кода ниже, как узнать количество пунктов <item> в структуре <items> и записать их имена <name> в массив, первый найденный <item> <name>Подсигар отечественный</name> записать в переменную удалось, но остальные не ищет и всё.
from lxml import etree xml_str = '''<orders date="2019-12-16 18:34"> <order id="95457387" state="accepted"> <name>Pupkin Oleg</name> <phone>+180660000000</phone> <items> <item id="576389023"> <name>Подсигар отечественный</name> <quantity>3</quantity> <currency>шт</currency> </item> <item id="576389024"> <name>Куртка замшивая</name> <quantity>3</quantity> <currency>шт</currency> </item> <item id="576389025"> <name>Кинокамера заграничная</name> <quantity>3</quantity> <currency>шт</currency> </item> </items> </order> <order id="95403040" state="closed"> <name>Razdolbaykin Alexander</name> <phone>+780660000000</phone> </order> </orders>''' root = etree.fromstring(xml_str) orders = root.xpath('/orders/order[@id="95403040"]') print(orders[0].find('name').text) #Product[0] = 'Подсигар отечественный' #Product[1] = 'Куртка замшивая' #Product[2] = 'Кинокамера заграничная'
Офлайн
857
Yuriy_VPython тут ни при чём. Ты не знаешь XPath. Он не относится к питону и довольно простой. Его надо изучать отдельно.
Не хватает моего опыта в Python-e
>>> import xml.etree.ElementTree as ET >>> >>> xml_str = '''<?xml version="1.0" encoding="utf-8"?> ... <orders date="2019-12-16 18:34"> ... <order id="95457387" state="accepted"> ... <name>Pupkin Oleg</name> ... <phone>+180660000000</phone> ... <items> ... <item id="576389023"> ... <name>Подсигар отечественный</name> ... <quantity>3</quantity> ... <currency>шт</currency> ... </item> ... <item id="576389024"> ... <name>Куртка замшивая</name> ... <quantity>3</quantity> ... <currency>шт</currency> ... </item> ... <item id="576389025"> ... <name>Кинокамера заграничная</name> ... <quantity>3</quantity> ... <currency>шт</currency> ... </item> ... </items> ... </order> ... <order id="95403040" state="closed"> ... <name>Razdolbaykin Alexander</name> ... <phone>+780660000000</phone> ... </order> ... </orders>''' >>> >>> doc = ET.fromstring(xml_str) >>> >>> nodes = doc.findall('.//order[@id="95457387"]/items/item/name') >>> len(nodes) 3 >>> >>> out = [i.text for i in nodes] >>> out ['Подсигар отечественный', 'Куртка замшивая', 'Кинокамера заграничная'] >>>
Офлайн
0
Спасибо за помощь! Смог разобраться благодаря вашим подсказкам, теперь всё работает. Спасибо FishHook и py.user.next за помощь. “+” Вам в репутацию))
Офлайн