【问题标题】:In Python - Parsing a response xml and finding a specific text vaule在 Python 中 - 解析响应 xml 并找到特定的文本值
【发布时间】:2011-10-05 21:52:26
【问题描述】:

我是 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 都没有成功,我已经到了不知道还能做什么的地步。

任何帮助将不胜感激

【问题讨论】:

    标签: python xml parsing memory


    【解决方案1】:

    据我所知,这很简单:

    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'))
    

    【讨论】:

      【解决方案2】:

      如果您只是想计算一个单词在 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
      

      【讨论】:

      • 从他只想计算特定标签内的单词的问题中可以清楚地看出。你也不能确定这个词实际上并没有被用作标签本身,所以这种方法显然是错误的
      • 虽然这对某些词有效,但在存在 XML 实体时会失败。
      • 哇,我应该得到这个。我可能会使用这个,因为 xml 响应不是重复的
      • 天啊,今天真讨厌。 OP 确实声明他“正在尝试计算一个单词在 xml 文档中出现的次数”。我将计数字符串更改为与他给出的标记示例不同。
      • @DerekSpringer 不讨厌......但是在 xml 文档中使用简单的 count() 显然是危险的,并且容易给你错误的答案......你不会知道他们什么时候错了。 ..因此强调评论
      【解决方案3】:

      这有帮助吗...

      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
      

      【讨论】:

      • 不,它只获取一个特定文本,而不是所有文本节点。
      • 我没有做他所有的功课......从那里他可以想办法自己使用 findall ...
      【解决方案4】:

      只需将字符串 'count' 替换为您想要计算的任何单词。如果要计算短语,则必须调整此代码,因为这是用于字数统计的。但无论如何,如何获取所有嵌入文本的答案是XML('&lt;your xml string here&gt;').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()])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多