解析XML会出现一个空列表(Python)

时间:2017-06-11 13:59:04

标签: python xml list findall

我使用下面的代码从代码下面的XML数据中提取数字。出于某种原因,我的清单却变空了。对不起,如果代码有点乱。这是一项正在进行中的工作,我正在尝试一些打印功能来尝试获得结果。当我得到"检索,len(xmldata),'字符'时,我认为问题出在这附近:

pydata = ET.fromstring(xmldata)

如果我打印

print (pydata)

我只得到这个:

<Element 'commentinfo' at 0x00000075968A7BD8>

我想我错过了一些非常小的东西,但我并没有把它弄清楚。

# Note - I am using Python 3.6
# exec(open("./trial.py").read())
# http://python-data.dr-chuck.net/comments_263475.xml

import xml.etree.ElementTree as ET
import urllib.request
sumcount = 0

while True:
    url = input('Enter url:')
    url = 'http://python-data.dr-chuck.net/comments_263475.xml'
    if len(url) < 1 : break
    print ('Retrieving', url)
    uh = urllib.request.urlopen(url)
    xmldata = uh.read()
    print ('Retrieved',len(xmldata),'characters')
    pydata = ET.fromstring(xmldata)
    print('Name:', pydata.find('name'))
    print('Attr:', pydata.find('comment'))
    lst = pydata.findall('comment')
    print (lst)
    print('Count:', len(lst))
    if True : break

这是XML:

#<comment>
#  <name>Matthias</name>
#  <count>97</count>
#</comment>

非常欢迎任何帮助!

2 个答案:

答案 0 :(得分:0)

您应该仔细阅读文档。

Element.findall() finds only elements with a tag which are direct children of the current element

如果您输入pydata,则会返回此信息:

>><Element 'comment' at 0x10411c090>

根元素下方的所有元素都没有标记comment,这可以通过以下方式轻松验证:

for child in pydata:
    print child.tag

>> name 
   count 

也看起来不像是在打印元素的实际文本值,所以更改这些行:

print('Name:', pydata.find('name'))
print('Attr:', pydata.find('comment'))

对此:

print('Name:', pydata.find('name').text)
print('Attr:', pydata.find('comment').text)

答案 1 :(得分:0)

根据您的建议进行了一些试验和错误之后,我找到了解决方案。最终的代码应该从XML代码中提取数字并对其求和。如果您对如何改进我的代码有任何建议,请告诉我们!

import xml.etree.ElementTree as ET
import urllib.request
sumcount = 0

while True:
    url = input('Enter url:')
    url = 'http://python-data.dr-chuck.net/comments_263475.xml'
    if len(url) < 1 : break
    print ('Retrieving', url)
    uh = urllib.request.urlopen(url)
    xmldata = uh.read()
    print ('Retrieved',len(xmldata),'characters')
    pydata = ET.fromstring(xmldata)
    for child in pydata:
        print (child.tag)
    lst = pydata.findall('./comments/comment')
    for comment in lst:
        scount = comment.find('count').text
        intscount = int(scount)
        sumcount = sumcount + intscount
    print('Entries:', len(lst))
    print('Sum:', sumcount)
    if True : break