使用python在xml中提取文本值

时间:2013-10-25 07:18:47

标签: python xml elementtree

我使用ElementTree尝试从XML中提取许多值。

以下是xml的示例: -

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE playerstats>
<playerstats>
<steamID>76561197960964581</steamID>
<gameName>Team Fortress 2</gameName>
<stats>
    <stat>
        <name>Scout.accum.iNumberOfKills</name>
        <value>1777</value>
    </stat>
    <stat>
        <name>Scout.accum.iPlayTime</name>
        <value>247469</value>
    </stat>
    <stat>
        <name>Scout.accum.iPointCaptures</name>
        <value>641</value>
    </stat>
    <stat>
        <name>Soldier.accum.iNumberOfKills</name>
        <value>1270</value>
    </stat>
    <stat>
        <name>Soldier.accum.iPlayTime</name>
        <value>94649</value>
    </stat>
    <stat>
        <name>Spy.accum.iNumberOfKills</name>
        <value>7489</value>
    </stat>
    <stat>
        <name>Spy.accum.iPlayTime</name>
        <value>1110582</value>
    </stat>
</stats>
</playerstats>

还有很多,但这只是一个样本。

我想提取并总结与“* .accum.iPlayTime”相关的所有值,以计算总播放时间。明星暗示所有阶级(例如侦察兵,士兵等)。

到目前为止我的代码(包括我的一些尝试): -

playerStatsKISA = urllib2.urlopen('http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=440&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&steamid=xxxxxxxxxxxxxxxxx&format=xml')
statsTF2 = playerStatsTF2.read()
theStatsTF2 = ET.fromstring(statsTF2)

totalTimesTF2 = theStatsKISA.findtext("Scout.accum.iPlayTime") # Didn't find anything
print totalTimesKISA

totalTimesTF2 = theStatsKISA.findall("./stats/stat/name") 
for indiv in totalTimesTF2: # Another failed attempt
    print indiv.attrib # didn't extract anything, I gather because the text I'm after is not an attribute but a value?
    if indiv.attrib == 'Scout.accum.iPlayTime':
        print "got it" # would extract value here, but it would be long winded to do this then try and extract the next value I'm actually after.

我的想法是从每个班级获取价值然后总结它。虽然我聚集在那里,但是在TF2类名称中使用*可以在一次犯规中获得所有价值,但是在我第一次弄清楚如何从标记中获取值后,我将会这样做。我需要的价值。

希望这是有道理的。

感谢。

2 个答案:

答案 0 :(得分:3)

使用text属性:

root = ET.fromstring(statsTF2)
for stat in root.findall("./stats/stat"):
    if stat.find('name').text.endswith('.accum.iPlayTime'):
        print stat.find('value').text

打印(给出问题中的xml):

247469
94649
1110582

在XPath中使用lxml

import lxml.etree as ET

root = ET.fromstring(statsTF2)
for text in root.xpath('./stats/stat[name[contains(text(), ".accum.iPlayTime")]]/value/text()'):
    print text

答案 1 :(得分:2)

这应该有效

totalTime = 0
root = ET.fromstring(statsTF2)
for stat in root.findall("./stats/stat"):
    if stat.find('name').text.endswith('accum.iPlayTime'):
        totalTime+=int(stat.find('value').text)


totalTime
>>> 1452700