首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python LXML从XML读取元素值

使用Python LXML从XML读取元素值
EN

Stack Overflow用户
提问于 2015-03-24 07:17:52
回答 4查看 1K关注 0票数 1
代码语言:javascript
复制
<markets xmlns="http://www.eoddsmaker.net/schemas/markets/1.0" D="2015-03-23T23:12:34" CNT="1521">
 <S I="50" N="Football">
  <C I="65" N="Russia">
    <L I="167" N="Premier League">
      <E I="1049367" DT="2015-04-05T15:00:00" ISH="0" BKS="20" T1="Ufa" T2="Terek Groznyi" T1I="79698" T2I="44081">
        <M K="1x2">
          <B I="81" BTDT="2015-03-23T23:04:00,825">
            <O N="1" V="3"/>
            <O N="X" V="3.1"/>
            <O N="2" V="2.25"/>
        </B>
      </M>
     </E>
    </L>
   </C>
 </S>
</markets>

我正在尝试使用Python中的etree来解析这个XML。我以前做过XML解析,但是文档总是采用这种格式。

代码语言:javascript
复制
  <tag> value </tag>

我不确定如何将"D“与"Markets”以及所有其他值区分开来。

这是我打开和解析XML文档的方式:

代码语言:javascript
复制
z = gzip.open("code2.zip", "r")

tree = etree.parse(z)
print(etree.tostring(tree, pretty_print=True))

我试过了:

代码语言:javascript
复制
for markets in tree.findall('markets'):
    print "found"

然而,这并不起作用。我希望能得到一些建议/建议。希望一旦我得到第一个"D“提取,我将能够得到其余的。

EN

回答 4

Stack Overflow用户

发布于 2015-03-24 08:54:36

这是处理具有默认名称空间的XML时的常见错误。您的XML具有默认名称空间,即在此处声明的没有前缀的名称空间:

xmlns="http://www.eoddsmaker.net/schemas/markets/1.0

因此,在您的示例中,所有元素都隐式地考虑在该名称空间中。使用xpath()查询名称空间中的元素的一种可能方法是:

代码语言:javascript
复制
.......
#creating prefix-to-namespace_uri mapping
ns = {'d' : 'http://www.eoddsmaker.net/schemas/markets/1.0'}

#use registered prefix along with the element name to query, and pass the mapping as 2nd argument
markets = tree.xpath('//d:markets', namespaces=ns)[0]

#get and print value of D attribute from <markets> :
print markets.get('D')
票数 2
EN

Stack Overflow用户

发布于 2015-03-24 07:26:40

我在不了解etree的情况下回答这个问题。我只需打开以下页面:https://docs.python.org/2/library/xml.etree.elementtree.html#parsing-xml

您正在寻找的是属性,并且展示了如何非常清晰地派生它们:

代码语言:javascript
复制
tree = etree.parse(z)
root = tree.getroot()
print root.attrib

这里有<markets>元素的所有属性,比如D和CNT。

你应该能够自己解决剩下的问题。您只需遍历每个元素的子元素并从每个元素中获取.attrib

考虑到我很容易找到这个答案,请在发布问题之前做更多的研究:)

附注:这个答案是为Python 2.7编写的。对于Python3,它将是print(tree.attrib)

票数 0
EN

Stack Overflow用户

发布于 2015-03-24 07:32:46

xml.etree上试试这个

代码语言:javascript
复制
import xml.etree.ElementTree as ET
root = ET.fromstring("""<markets xmlns="http://www.eoddsmaker.net/schemas/markets/1.0" D="2015-03-23T23:12:34" CNT="1521">
     <S I="50" N="Football">
      <C I="65" N="Russia">
        <L I="167" N="Premier League">
          <E I="1049367" DT="2015-04-05T15:00:00" ISH="0" BKS="20" T1="Ufa" T2="Terek Groznyi" T1I="79698" T2I="44081">
            <M K="1x2">
              <B I="81" BTDT="2015-03-23T23:04:00,825">
                <O N="1" V="3"/>
                <O N="X" V="3.1"/>
                <O N="2" V="2.25"/>
            </B>
          </M>
         </E>
        </L>
       </C>
     </S>
    </markets>""")

>>>print root.attrib
{'CNT': '1521', 'D': '2015-03-23T23:12:34'}
>>>print root[0].attrib
{'I': '50', 'N': 'Football'}
#and so on to next parse next line

如果需要从 xml 文件进行解析,则使用

代码语言:javascript
复制
import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()

有关更多信息,请参阅https://docs.python.org/2/library/xml.etree.elementtree.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29222209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档