通过xml迭代查找具有python特定扩展名的url

时间:2012-07-10 21:56:01

标签: python xml regex xml-parsing

我有一个从网址下载的xml文件。然后,我想迭代遍历xml,找到具有特定文件扩展名的文件的链接。

我的xml看起来像这样:

<Foo>
    <bar>
        <file url="http://foo.txt"/>
        <file url="http://bar.doc"/>
    </bar>
</Foo>

我已编写代码来获取xml文件,如下所示:

import urllib2, re
from xml.dom.minidom import parseString

file = urllib2.urlopen('http://foobar.xml')
data = file.read()
file.close()
dom = parseString(data)
xmlTag = dom.getElementsByTagName('file')

然后我想“让这样的事情发挥作用:

   i=0
    url = ''
    while( i < len(xmlTag)):
         if re.search('*.txt', xmlTag[i].toxml() ) is not None:
              url = xmlTag[i].toxml()
         i = i + 1;

** Some code that parses out the url **

但是这会引发错误。任何人都有关于更好方法的提示吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

坦率地说,你的最后一点代码令人厌恶。 dom.getElementsByTagName('file')为您提供了树中所有<file>元素的列表...只需迭代它。

urls = []
for file_node in dom.getElementsByTagName('file'):
    url = file_node.getAttribute('url')
    if url.endswith('.txt'):
        urls.append(url)

顺便说一下,你不应该用Python手工编写索引。即使在极少数情况下您需要索引号,也只需使用enumerate:

mylist = ['a', 'b', 'c']
for i, value in enumerate(mylist):
    print i, value

答案 1 :(得分:3)

使用lxmlurlparseos.path的示例:

from lxml import etree
from urlparse import urlparse
from os.path import splitext

data = """
<Foo>
    <bar>
        <file url="http://foo.txt"/>
        <file url="http://bar.doc"/>
    </bar>
</Foo>
"""

tree = etree.fromstring(data).getroottree()
for url in tree.xpath('//Foo/bar/file/@url'):
    spliturl = urlparse(url)
    name, ext = splitext(spliturl.netloc)
    print url, 'is is a', ext, 'file'