Парсинг xml Python
Есть файл xml, который нужно парсить на python, для нахождения тегов. Подскажите, как посчитать количество повторений этих тегов? Вывести в самом конце сам тег - количество. Вот файл xml:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-11-17</publish_date>
<description>After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.</description>
</book>
</catalog>
Ниже код:
# -*- coding: utf-8 -*-
from lxml import etree
def parseBookXML(xmlFile):
with open(xmlFile) as fobj:
xml = fobj.read()
root = etree.fromstring(xml)
book_dict = {}
books = []
for book in root.getchildren():
for elem in book.getchildren():
if not elem.text:
text = "None"
else:
text = elem.text
print(elem.tag + " => " + text)
book_dict[elem.tag] = text
if book.tag == "book":
books.append(book_dict)
book_dict = {}
return books
if __name__ == "__main__":
parseBookXML("books.xml")
Ответы (1 шт):
Автор решения: Dmitry
→ Ссылка
Интересненько. Формализую задачу: вам нужно найти количество повторений тегов. Непонятно каких... Например для всех:
import re
from collections import Counter
def parseBookXML(xmlFile):
with open(xmlFile) as fobj:
xml = fobj.read()
# понимаю, что все тэги парные и смысла включать все нет смысла,
# буду забирать только открывающиеся
pattern = r"<\w{1,}"
how_many_tags = Counter(re.findall(pattern, k))
# что содержит how_many_tags
# Counter({'<book': 3, '<author': 3, '<title': 3, '<genre': 3, '<price': 3, '<publish_date': 3, '<description': 3, '<catalog': 1})
# если напрягают символы в начале ключей, то можно почистить
clear = {}
for i in how_many_tags:
key = i[1:]
clear[key] = how_many_tags[i]
# ну, и переменная clear {'catalog': 1, 'book': 3, 'author': 3, 'title': 3, 'genre': 3, 'price': 3, 'publish_date': 3, 'description': 3}
Если нужен подсчет вместе с закрывающими, то умножьте на 2 все значения и будет вам счастье.