Найти - Пользователи
Полная версия: Парсер XML
Начало » Python для новичков » Парсер XML
1 2 3 4
8toni8
Есть такой 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 ?
py.user.next
  
>>> 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
8toni8
Большое спасибо, вроде разобрался. Вот что у меня получилось:

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

Теперь буду пытаться получить значение тега из конкретного атрибута…
vic57
с 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
py.user.next
vic57
с lxml проще
Интерфейс для xpath есть и в библиотечном модуле xml.etree.ElementTree . Ну там он не полный, конечно, но тоже можно пользоваться.
vic57
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
просто сравните два метода
py.user.next
vic57
делай одно, но делай это хорошо.
А есть такая фраза: не плоди сущности без необходимости.

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

То же самое про numpy я в соседнем топике говорил. Да, она быстрая, но её может не быть на компе. То есть уже на ряде компов скрипт не запустится. Бывают и версионные различия: ты написал на старом numpy, а там стоит новый numpy. То есть заморочек бывает много и на первый взгляд их не видно, но только потом в реальной ситуации ты сидишь и думаешь “блин, а что делать?”.
vic57
http://portablepython.com/
носится с собой, заводится с флешки
py.user.next
vic57
носится с собой, заводится с флешки
Вот возьми хостинг какой-нибудь и туда поставь его. Нужно вот прямо сейчас, чтобы твоё приложение работало в вебе.
doza_and
:)
py.user.next
Вот возьми хостинг какой-нибудь и туда поставь его
Вариант конечно. Но не везде разрешен доступ в интернет, а во многих местах его физически нет, даже gprs.
vic57
носится с собой, заводится с флешки
Во многих местах кстати и флешку в местные компы не дадут совать (порты демонтированы).
Так что демонстрация на своем ноуте, а установка и изменение софта через соответствующий отдел.

Проблема с установкой lxml автоматически снимается.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB