Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 1, 2018 19:05:25

8toni8
Зарегистрирован: 2018-01-01
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсер XML

Есть такой XML код:

 <data>
    <items>
        <item name="item1">1</item>
        <item name="item2">2</item>
        <item name="item3">3</item>
        <item name="item4">4</item>
    </items>
</data>

С помощью программы:
 from xml.dom import minidom
xmldoc = minidom.parse('items.xml')
itemlist = xmldoc.getElementsByTagName('item')
print(len(itemlist))
print(itemlist[0].attributes['name'].value)
for s in itemlist:
    print(s.attributes['name'].value)

Из данного примера в принципе понятно как читается атрибуты XML, подскажите как вытащить значения между <item name=“item1”></item> ? Или может быть существует инструкция на русском языке по описанию модуля xml.dom minidom ?

Офлайн

#2 Янв. 2, 2018 12:49:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9975
Репутация: +  856  -
Профиль   Отправить e-mail  

Парсер XML

  
>>> import xml.dom.minidom
>>> 
>>> doc = xml.dom.minidom.parseString('<item name="item1">1</item>')
>>> doc
<xml.dom.minidom.Document object at 0x7f78bdf2a228>
>>> doc.firstChild
<DOM Element: item at 0x7f78bdf2f638>
>>> doc.firstChild.firstChild
<DOM Text node "'1'">
>>> doc.firstChild.firstChild.nodeValue
'1'
>>>

8toni8
Или может быть существует инструкция на русском языке по описанию модуля xml.dom minidom ?
Мне хватило выполнить
import xml.dom.minidom
help(xml.dom.minidom)
doc = xml.dom.minidom.parseString('<item name="item1">1</item>')
help(doc)
чтобы понять, что там есть.
Но вообще надо использовать официальную документацию к модулю
python.org. xml.dom.Node.nodeValue



Отредактировано py.user.next (Янв. 2, 2018 12:49:44)

Офлайн

#3 Янв. 6, 2018 18:43:43

8toni8
Зарегистрирован: 2018-01-01
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсер XML

Большое спасибо, вроде разобрался. Вот что у меня получилось:

 from xml.dom.minidom import *
xml = parse('document.xml')
name = xml.getElementsByTagName('value')
for node in name:
  print node.childNodes[0].nodeValue

Теперь буду пытаться получить значение тега из конкретного атрибута…

Офлайн

#4 Янв. 6, 2018 19:09:34

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Парсер XML

с lxml проще

pip3 install lxml
 >>> from lxml import etree
>>> doc='''<data>
    <items>
        <item name="item1">1</item>
        <item name="item2">2</item>
        <item name="item3">3</item>
        <item name="item4">4</item>
    </items>
</data>'''
>>> tree = etree.fromstring(doc)
>>> path = tree.xpath('//item')
>>> for i in path:
	print(i.tag,i.attrib,i.text)
	
item {'name': 'item1'} 1
item {'name': 'item2'} 2
item {'name': 'item3'} 3
item {'name': 'item4'} 4

Офлайн

#5 Янв. 7, 2018 03:00:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9975
Репутация: +  856  -
Профиль   Отправить e-mail  

Парсер XML

vic57
с lxml проще
Интерфейс для xpath есть и в библиотечном модуле xml.etree.ElementTree . Ну там он не полный, конечно, но тоже можно пользоваться.



Офлайн

#6 Янв. 7, 2018 03:29:14

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Парсер XML

py.user.next
Ну там он не полный, конечно, но тоже можно пользоваться.
ну и зачем?
делай одно, но делай это хорошо.
мне lxml хватает и другого не надо
https://python-scripts.com/xml-python
https://python-scripts.com/parsing-lxml
https://pep8.ru/doc/dive-into-python-3/14.html
просто сравните два метода

Отредактировано vic57 (Янв. 7, 2018 03:48:15)

Офлайн

#7 Янв. 7, 2018 03:51:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9975
Репутация: +  856  -
Профиль   Отправить e-mail  

Парсер XML

vic57
делай одно, но делай это хорошо.
А есть такая фраза: не плоди сущности без необходимости.

vic57
мне lxml хватает и другого не надо
Да, вещь хорошая, а потом тебе раз и скрипт надо запустить на Windows XP. Ты такой “ага, сейчас я поставлю lxml и всё будет нормально”. Начинаешь ставить, а он не ставится. Начинаешь его компилировать, а он не компилируется. Ну ошибки какие-то, а как их разрулить? У меня вот так было. Ощущения такие, будто на ноутбук воду проливаешь из стакана. То есть компьютер-то есть, но это просто кусок железа, а работать надо прямо сейчас. Вот после этого и наступает просветление: можешь написать через стандартную - пиши через стандартную. Вот у него случай как раз такой, заморочек сильных не нужно ему. Необходимости прямо такой в lxml нет.

То же самое про numpy я в соседнем топике говорил. Да, она быстрая, но её может не быть на компе. То есть уже на ряде компов скрипт не запустится. Бывают и версионные различия: ты написал на старом numpy, а там стоит новый numpy. То есть заморочек бывает много и на первый взгляд их не видно, но только потом в реальной ситуации ты сидишь и думаешь “блин, а что делать?”.



Отредактировано py.user.next (Янв. 7, 2018 03:54:59)

Офлайн

#8 Янв. 7, 2018 05:08:54

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Парсер XML

http://portablepython.com/
носится с собой, заводится с флешки

Отредактировано vic57 (Янв. 7, 2018 05:25:36)

Офлайн

#9 Янв. 7, 2018 05:58:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9975
Репутация: +  856  -
Профиль   Отправить e-mail  

Парсер XML

vic57
носится с собой, заводится с флешки
Вот возьми хостинг какой-нибудь и туда поставь его. Нужно вот прямо сейчас, чтобы твоё приложение работало в вебе.



Офлайн

#10 Янв. 7, 2018 09:25:47

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Парсер XML

:)

py.user.next
Вот возьми хостинг какой-нибудь и туда поставь его
Вариант конечно. Но не везде разрешен доступ в интернет, а во многих местах его физически нет, даже gprs.
vic57
носится с собой, заводится с флешки
Во многих местах кстати и флешку в местные компы не дадут совать (порты демонтированы).
Так что демонстрация на своем ноуте, а установка и изменение софта через соответствующий отдел.

Проблема с установкой lxml автоматически снимается.



Отредактировано doza_and (Янв. 7, 2018 09:26:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version