从值标签Etree XML python中提取文本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从值标签Etree XML python中提取文本相关的知识,希望对你有一定的参考价值。
我想从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='"Envelopes"'>
<value>"Envelopes"</value>
<value>"Labels"</value>
<value>"Pens & Art Supplies"</value>
<value>"Rubber Bands"</value>
<value>"Scissors, Rulers and Trimmers"</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)
- 我没有得到正确的结果。
试试这个:
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]
这可能有所帮助
# -*- 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='"Envelopes"'>
<value>"Envelopes"</value>
<value>"Labels"</value>
<value>"Pens & Art Supplies"</value>
<value>"Rubber Bands"</value>
<value>"Scissors, Rulers and Trimmers"</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"
Rakesh的答案很棒,只是想我会为你的代码无效的原因添加一些解释。
首先,您需要将XML转换为ElementTree - 这基本上只是一个Python对象,具有与XML对应的元素和子元素的树状结构,但您可以在Python中使用它。
如果您的XML位于文件中(而不仅仅是代码中的字符串),则可以执行以下操作:
tree = ET.parse('myxmlfile.xml')
然后root
是这棵树的“最外层”元素,你需要掌握它才能在树上工作并找到元素等:
root = tree.getroot()
(如果你执行ET.fromstring(s)
,这将返回根元素,因此您不需要getroot步骤。)
在你的例子中,root
是datas
元素,这是你的一个问题:你的路径不需要包含'数据',因为那是你已经开始的地方。
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>')
这些参考可能对您有所帮助:
- 当我学习使用ElementTree时,我发现这非常有用,作为介绍:http://effbot.org/zone/element.htm
- 这个更详细,也包括iter()和iterparse():https://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree
- 官方文档也很好:https://docs.python.org/3.6/library/xml.etree.elementtree.html
以上是关于从值标签Etree XML python中提取文本的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python Etree 解析 XML 并返回指定的标签而不考虑命名空间
python xml.etree.ElementTree 附加到子元素
忽略 xml.etree.ElementTree.XMLParser Python 中不匹配的标签