从值标签Etree XML python中提取文本

问题描述 投票:0回答:3

我想从value标签中提取文本,我的xml代码片段和尝试如下所示:

<datas>
  <data>
    <column datatype='string' name='[Sub-Category (group)]' role='dimension' type='nominal'>
      <calculation class='categorical-bin' column='[Product Sub-Category]' new-bin='false'>
        <bin value='&quot;Envelopes&quot;'>
          <value>&quot;Envelopes&quot;</value>
          <value>&quot;Labels&quot;</value>
          <value>&quot;Pens &amp; Art Supplies&quot;</value>
          <value>&quot;Rubber Bands&quot;</value>
          <value>&quot;Scissors, Rulers and Trimmers&quot;</value>
        </bin>
      </calculation>
   </column>      
</data>
</datas>

我的尝试:

root = 'myxmlfile.xml'
valuelist = []
for i in root.findall('./datas/data/column/calculation/bin')
    val  = i.find('value')
    if val:
       for j in val:
           valuelist.append(j.text)
  • 我没有得到正确的结果。
python xml python-3.x xml-parsing elementtree
3个回答
1
投票

试试这个:

root = open('/your/path_to_file/data.xml', 'rb+')
doc =  ET.parse(root).getroot()
valuelist = []
for i in doc.findall('.//bin'):
    val  = i.findall('value')
    for v in val:
        valuelist.append(v.text)
print valuelist

输出:

['"Envelopes"', '"Labels"', '"Pens & Art Supplies"', '"Rubber Bands"', '"Scissors, Rulers and Trimmers"']
[Finished in 0.0s]

1
投票

这可能有所帮助

# -*- coding: utf-8 -*-
s = """<datas>
  <data>
<column datatype='string' name='[Sub-Category (group)]' role='dimension' type='nominal'>
              <calculation class='categorical-bin' column='[Product Sub-Category]' new-bin='false'>
                <bin value='&quot;Envelopes&quot;'>
                  <value>&quot;Envelopes&quot;</value>
                  <value>&quot;Labels&quot;</value>
                  <value>&quot;Pens &amp; Art Supplies&quot;</value>
                  <value>&quot;Rubber Bands&quot;</value>
                  <value>&quot;Scissors, Rulers and Trimmers&quot;</value>
                </bin>
              </calculation>
    </column>
 </data>
</datas>"""

import xml.etree.ElementTree as et
tree = et.fromstring(s)
for i in tree.findall('.//data/column/calculation/bin'):
    for j in i.findall('value'):
        print(j.text)

输出:

"Envelopes"
"Labels"
"Pens & Art Supplies"
"Rubber Bands"
"Scissors, Rulers and Trimmers"

1
投票

Rakesh的答案很棒,只是想我会为你的代码无效的原因添加一些解释。

首先,您需要将XML转换为ElementTree - 这基本上只是一个Python对象,具有与XML对应的元素和子元素的树状结构,但您可以在Python中使用它。

如果您的XML位于文件中(而不仅仅是代码中的字符串),则可以执行以下操作:

tree = ET.parse('myxmlfile.xml')

然后root是这棵树的“最外层”元素,你需要掌握它才能在树上工作并找到元素等:

root = tree.getroot()

(如果你执行ET.fromstring(s),这将返回根元素,因此您不需要getroot步骤。)

在你的例子中,rootdatas元素,这是你的一个问题:你的路径不需要包含'数据',因为那是你已经开始的地方。

val = i.find('value')将只返回第一个value元素,而不是所有value元素的列表,这是你想要的。因此,当你尝试做for j in val时,Python实际上是在尝试查找value元素的子元素(它不存在),所以它没有任何东西可以附加到valuelist。你需要在这里使用findall(),如果你将它与for循环结合起来,那么你不需要进行if val检查,因为如果for空回来,findall()循环就不会运行。

将所有这些放在一起:

import xml.etree.ElementTree as ET

tree = ET.parse('myxmlfile.xml')  # change to wherever your file is located
root = tree.getroot()

binlist = []
for i in root.findall('./data/column/calculation/bin'):
    valuelist = []
    for j in i.findall('value'):
        valuelist.append(j.text)
    binlist.append(valuelist)

然后binlist是一个列表,列表中的每个项目都是该bin的值列表。

如果您只有一个bin,那么您可以简化代码的后半部分:

import xml.etree.ElementTree as ET

tree = ET.parse('myxmlfile.xml')  # change to wherever your file is located
root = tree.getroot()

bin = root.find('./data/column/calculation/bin')
valuelist = []
for j in bin.findall('value'):
   valuelist.append(j.text)

请注意,我使用ET而不是et来导入ElementTree(这似乎是惯例)。这也假设datas是XML的第一个元素。如果你给出的代码片段嵌套在一个更大的XML文件中,你需要首先通过执行以下操作来获取该元素:

bin = root.find('<path to bin element>')

这些参考可能对您有所帮助:

© www.soinside.com 2019 - 2024. All rights reserved.