Используя минидом для разбора xml
Привет, у меня проблемы с пониманием модуля minidom для Python.
У меня есть XML, который выглядит так:
<Show>
<name>Dexter</name>
<totalseasons>7</totalseasons>
<Episodelist>
<Season no="1">
<episode>
<epnum>1</epnum>
<seasonnum>01</seasonnum>
<prodnum>101</prodnum>
<airdate>2006-10-01</airdate>
<link>http://www.tvrage.com/Dexter/episodes/408409</link>
<title>Dexter</title>
</episode>
<episode>
<epnum>2</epnum>
<seasonnum>02</seasonnum>
<prodnum>102</prodnum>
<airdate>2006-10-08</airdate>
<link>http://www.tvrage.com/Dexter/episodes/408410</link>
<title>Crocodile</title>
</episode>
<episode>
<epnum>3</epnum>
<seasonnum>03</seasonnum>
<prodnum>103</prodnum>
<airdate>2006-10-15</airdate>
<link>http://www.tvrage.com/Dexter/episodes/408411</link>
<title>Popping Cherry</title>
</episode>
Более симпатично: http://services.tvrage.com/feeds/episode_list.php?sid=7926
И это мой код на Python, который пытается прочитать из этого:
xml = minidom.parse(urlopen("http://services.tvrage.com/feeds/episode_list.php?sid=7926"))
for episode in xml.getElementsByTagName('episode'):
for node in episode.attributes['title']:
print node.data
Я не могу получить фактические данные эпизода, так как я хочу получить все данные из каждого эпизода. Я пробовал разные варианты, но не могу заставить его работать. В основном я получаю <DOM Element: asdasd>
назад. Я забочусь только о данных внутри каждого эпизода.
Спасибо за помощь
3 ответа
Каждый episode
элемент имеет дочерние элементы, включая title
элемент. Однако ваш код ищет атрибуты.
Чтобы получить текст из элемента minidom, вам нужна вспомогательная функция:
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
И тогда вы сможете легче распечатать все заголовки:
for episode in xml.getElementsByTagName('episode'):
for title in episode.getElementsByTagName('title'):
print getText(title)
title
это не атрибут, это тег. Атрибут похож src
в <img src="foo.jpg" />
>>> parsed = parseString(s)
>>> titles = [n.firstChild.data for n in parsed.getElementsByTagName('title')]
>>> titles
[u'Dexter', u'Crocodile', u'Popping Cherry']
Вы можете расширить вышеупомянутое, чтобы получить другие детали. lxml
лучше подходит для этого, хотя. Как видно из фрагмента выше, минидом не очень дружелюбен.
Благодаря Martijn Pieters, который помог мне с ElementTree API, я решил эту проблему.
xml = ET.parse(urlopen("http://services.tvrage.com/feeds/episode_list.php?sid=7296"))
print 'xml fetched..'
for episode in xml.iter('episode'):
print episode.find('title').text
Спасибо