Парсинг XML на python
Вопрос следующий нужен парсинг XML файла, необходимо вытащить поочередно определенные теги, например тег name
Код следующий, не работающий
import xml.etree.ElementTree as ET
root = ET.parse('файл.xml').getroot()
for type_tag in root.findall('shop/offers/offer'):
value = type_tag.get('name')
print(value)
Файл тут https://sotiknadom.ru/snprice.xml
Очень прошу о помощи!
Ответы (2 шт):
Автор решения: Namerek
→ Ссылка
Вариант с BeautifulSoup
# pip install bs4 lxml (если не установлены)
from bs4 import BeautifulSoup as Soup
if __name__ == '__main__':
with open('snprice.xml', 'r', encoding='utf-8') as xml:
soup = Soup(xml.read(), 'lxml')
names = [offer.find('name').text for offer in soup.find_all('offer')]
print(names, sep='\n')
А это рабочий вариант Вашей реализации:
import xml.etree.ElementTree as ET
xml_file = ET.parse('snprice.xml')
for type_tag in xml_file.findall('shop/offers/offer'):
value = type_tag.find('name').text
print(value)
Ну или можно немного сократить код:
from xml.etree.ElementTree import parse
print(
*(
type_tag.text for type_tag in parse('snprice.xml').findall('shop/offers/offer/name')
),
sep='\n'
)
Не рекомендуется, если не уверены в исходных данных и нужны какие либо проверки в ходе выполнения
Автор решения: OldHuman
→ Ссылка
Всем, кто столкнется с такой структурой XML:
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
<title>SotikNadom</title>
<link rel="alternate" type="text/html">https://sotiknadom.ru/</link>
<updated>2020-08-01T06:03:43Z</updated>
<entry >
**<g:**title>Монитор Acer K242HLbd (черный)</g:title>
**<g:**link>https://sotiknadom.ru/monitory/monitor-acer-k242hlbd-chernyj</g:link>
**<g:**price>8800.00 RUB</g:price>
**<g:**id>51</g:id>
**<g:**availability>in stock</g:availability>
**<g:**condition>new</g:condition>
Делать так:
import xml.etree.ElementTree as ET
xml_file = ET.parse('sngoogle2.xml')
for type_tag in xml_file.findall**('{http://www.w3.org/2005/Atom}entry')**:
value = type_tag.find**('{http://base.google.com/ns/1.0}price')**.text
print(value)
Документация: https://docs.python.org/3/library/xml.etree.elementtree.html#parsing-xml-with-namespaces