在Python中 - 解析响应xml并查找特定的文本值

时间:2011-10-05 21:52:26

标签: python xml parsing memory

我是python的新手,我在使用xml和python时遇到了特别困难。我的情况是这样,我试图计算一个单词出现在xml文档中的次数。很简单,但xml文档是来自服务器的响应。是否可以在不写入文件的情况下执行此操作?尝试从记忆中做到这一点会很棒。

以下是xml代码示例:

<xml>
  <title>Info</title>
    <foo>aldfj</foo>
      <data>Text I want to count</data>
</xml>

这是我在python中的内容

import urllib2
import StringIO
import xml.dom.minidom
from xml.etree.ElementTree import parse
usock = urllib.urlopen('http://www.example.com/file.xml') 
xmldoc = minidom.parse(usock)
print xmldoc.toxml()

过去这一点我尝试使用StringIO,ElementTree和minidom没有成功,我已经达到了一个我不知道还能做什么的点。

非常感谢任何帮助

4 个答案:

答案 0 :(得分:5)

据我所知,这很简单:

import urllib2
from xml.dom import minidom

usock = urllib2.urlopen('http://www.example.com/file.xml') 
xmldoc = minidom.parse(usock)

for element in xmldoc.getElementsByTagName('data'):
  print element.firstChild.nodeValue

所以要计算一个字符串的出现次数,试试这个(有点浓缩,但我喜欢单行):

count = sum(element.firstChild.nodeValue.find('substring') for element in xmldoc.getElementsByTagName('data'))

答案 1 :(得分:4)

如果您只是想计算一个单词出现在XML文档中的次数,只需将该文档作为字符串读取并进行计数:

import urllib2
data = urllib2.urlopen('http://www.example.com/file.xml').read()
print data.count('foobar')

否则,您可以遍历您正在寻找的标签:

from xml.etree import cElementTree as ET
xml = ET.fromstring(urllib2.urlopen('http://www.example.com/file.xml').read())
for data in xml.getiterator('data'):
    # do something with
    data.text

答案 2 :(得分:2)

这有帮助......

from xml.etree.ElementTree import XML

txt = """<xml>
           <title>Info</title>
           <foo>aldfj</foo>
           <data>Text I want to count</data>
         </xml>"""

# this will give us the contents of the data tag.
data = XML(txt).find("data").text

# ... so here we could do whatever we want
print data

答案 3 :(得分:0)

只需将字符串'count'替换为您想要计算的任何单词。如果你想计算短语,那么你必须调整这个代码,因为这是用于字数统计。但无论如何,如何获取所有嵌入文本的答案是XML('<your xml string here>').itertext()

from xml.etree.ElementTree import XML
from re import findall

txt = """<xml>
        <title>Info</title>
        <foo>aldfj</foo>
        <data>Text I want to count</data>
    </xml>"""

sum([len(filter(lambda w: w == 'count', findall('\w+', t))) for t in XML(txt).itertext()])