我有一个从网址下载的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 **
但是这会引发错误。任何人都有关于更好方法的提示吗?
谢谢!
答案 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)
使用lxml
,urlparse
和os.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'