使用minidom解析xml

时间:2012-09-09 12:00:31

标签: python xml minidom

您好我无法理解Python的minidom模块。

我的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 个答案:

答案 0 :(得分:1)

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更适合这种情况。正如你从上面的片段中看到的那样,minidom并不那么友好。

答案 1 :(得分:1)

每个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)

答案 2 :(得分:0)

感谢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

由于