我使用下面的代码从代码下面的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>
非常欢迎任何帮助!
答案 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