使用Element树从python中的文件读取XML数据

时间:2015-03-05 22:12:29

标签: python xml elementtree

我正在尝试从我的xml文件中打印数据,但使用ElementTree并没有帮助。数据正在成功写入文件'data.xml'但无法读取,控制台终止,退出代码为0而不显示任何数据。甚至没有输入'data.findall'循环。

import urllib2
import xml.etree.ElementTree as ET

def main():
    search_url = "http://export.arxiv.org/api/query?search_query=all:social+science&start=0&max_results=10&sortBy=submittedDate&sortOrder=descending"
    file1 = open("data.xml", 'w')
    file1.write(''.join(map(str, urllib2.urlopen(search_url))))
    file1.close()
    print_data()    

def print_data():
    data = ET.parse('data.xml').getroot()
    for child in data.findall('entry'):
        print "Title :" + child.find('title').text + "\n"
        print "hahah"
        print "Summary :" + child.find('summary').text + "\n"
        print "Published On :" + child.find('published').text + "\n"
        for grab in child.find('link'):
            if grab.get('type') == 'application/pdf':
                print "Download Link :" + grab.get('href').text
                link = grab.get('href').text
                get_data = urllib2.urlopen(link)
                file2 = open('paper.pdf', 'w')
                file2.write(get_data.read())
                file2.close()
if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:0)

您需要将命名空间传递给findall以及标记名称。

替换它:

for child in data.findall('entry'):

有了这个:

for child in data.findall('{http://www.w3.org/2005/Atom}entry'):

其中http://www.w3.org/2005/Atom是data.xml

中根元素的xmlns属性的值

答案 1 :(得分:0)

  

Element.findall()仅查找具有直接标记的元素   当前元素的子元素。 Element.find()找到第一个孩子   使用特定标记,Element.text访问元素的文本   内容。 Element.get()访问元素的属性:   https://docs.python.org/2/library/xml.etree.elementtree.html

所以,我试着找到:

def print_data():
    data = ET.parse('data.xml').getroot()
    for child in data.findall('entry'):
        for entry in child.findall('entry'):
            print entry

并且此代码查找所有条目,为什么很多条目不是直接子项,我现在不用。