- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有以下 XML 文档:
<species>
Mammals: <dog/> <cat/>
Reptiles: <snake/> <turtle/>
Birds: <seagull/> <owl/>
</species>
然后我得到这样的 species
元素:
import lxml.etree
doc = lxml.etree.fromstring(xml)
species = doc.xpath('/species')[0]
现在我想打印一份按物种分组的动物列表。我如何使用 ElementTree API 来做到这一点?
最佳答案
如果您枚举所有节点,您将看到一个带有类的文本节点,后跟带有物种的元素节点:
>>> for node in species.xpath("child::node()"):
... print type(node), node
...
<class 'lxml.etree._ElementStringResult'>
Mammals:
<type 'lxml.etree._Element'> <Element dog at 0xe0b3c0>
<class 'lxml.etree._ElementStringResult'>
<type 'lxml.etree._Element'> <Element cat at 0xe0b410>
<class 'lxml.etree._ElementStringResult'>
Reptiles:
<type 'lxml.etree._Element'> <Element snake at 0xe0b460>
<class 'lxml.etree._ElementStringResult'>
<type 'lxml.etree._Element'> <Element turtle at 0xe0b4b0>
<class 'lxml.etree._ElementStringResult'>
Birds:
<type 'lxml.etree._Element'> <Element seagull at 0xe0b500>
<class 'lxml.etree._ElementStringResult'>
<type 'lxml.etree._Element'> <Element owl at 0xe0b550>
<class 'lxml.etree._ElementStringResult'>
所以你可以从那里构建它:
my_species = {}
current_class = None
for node in species.xpath("child::node()"):
if isinstance(node, lxml.etree._ElementStringResult):
text = node.strip(' \n\t:')
if text:
current_class = my_species.setdefault(text, [])
elif isinstance(node, lxml.etree._Element):
if current_class is not None:
current_class.append(node.tag)
print my_species
结果
{'Mammals': ['dog', 'cat'], 'Reptiles': ['snake', 'turtle'], 'Birds': ['seagull', 'owl']}
这一切都很脆弱......文本节点排列方式的微小变化可能会扰乱解析。
关于python - 遍历 lxml etree 中的文本和元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071072/
lxml提供了一些不同的函数来解析字符串。其中两个,etree.fromstring()和 etree.XML() ,看起来很像。前者的文档字符串说它用于解析“字符串”,而后者是“字符串常量”。此外,
我有一个使用 lxml.etree 解析 XML 的脚本: from lxml import etree parser = etree.XMLParser(load_dtd=True, resolve
我一直在将我的一些原始 xml.etree.ElementTree (ET) 代码转换为 lxml.etree (lxmlET )。幸运的是,两者之间有很多相似之处。 但是,我确实偶然发现了一些我在任
是否有任何解决方案可以添加不带前缀的命名空间(我的意思是这些 ns0、ns1),它们适用于所有 etree 实现,或者每个实现都有可行的解决方案? 目前我有以下解决方案: lxml - 元素的 nsm
我正在使用 aws 的 Alexa api,但我发现很难解析结果以获得我想要的内容 alexa api 返回一个对象树 我使用此代码来打印树 from lxml import etree root
当涉及到模块/库时,为了可读性,我喜欢在 python 中使用完整的命名空间。我想知道为什么这对 xml 库不起作用。我认为 import xml 还将导入 etree 和命名空间中的所有其他内容。至
我有一个从 etree 元素返回列表的函数,但它不会查看嵌套元素。 (我正在
尝试从 serpscrap 包运行示例 .py 时出现错误。 我在 Pythonista 中使用 iPhoneX。 如有任何帮助,我们将不胜感激。 这是回溯 Traceback (most recen
如何删除或移除 server1 的所有条目,包括标签?我尝试使用 etree 删除功能,但它没有帮助
我试图将多个文件写入一个目录,每个文件之间几乎没有变化(例如增量ID号)当我尝试运行我的程序时,它在写入大约5个文件后失败。但是当我再次尝试并重新选择源文件时,它就有效了。这是我的代码: if not
如何在 Python xml.etree 中克隆 Element 对象?我正在尝试按程序移动和复制(然后修改它们的属性)节点。 最佳答案 您可以使用 copy.deepcopy()制作元素的副本。 (
我正在创建一个简单的脚本来使用特定模式解析、验证、修复和重新打印 XML 文件。整个过程运行良好,但问题是当我打印修改后的 ElementTree 时,它会删除我所有的实体引用。 这是简化的 py
xml文件结构如下 我的解析器首先获取所有 元素 from lxml import etr
在Relationship下,我只想保留具有TO_FDN="FtpServer=,并删除所有其他内容。如何在 python 2.6 中使用 etree 来做到这一点?
尝试使用 lxml 生成 xml 文件。 在 API 文档中指出 xmlfile 类存在: http://lxml.de/api/lxml.etree.xmlfile-class.html 我使用导入
我想在 Python 中创建一个像这样的元素树: 我想将其用作一个空模板,以便稍后使用。但是,我无法插入或附加多个 元素到元素,不过 etree.SubElement作品。更具体
我有一个脚本,它使用 xml.etree.ElementTree 来解析 XML 文件,并且应该向元素添加一个子元素。我有两种方法,这两种方法在技术上都有效,但当我使用 ET.dump(root) 转
我有一个 XML 格式的 ISM 文件(InstallShield 项目)。 我需要更改文件中的一些属性,因此我使用了 xml.etree.ElementTree(Python 库)。 我可以找到这些
我正在遍历 XML 树,但从树中提取节点而留下其内部节点时遇到了一些麻烦。 例如:
为了向现有元素添加新的子元素,我必须调用类方法,并将父元素作为参数。我希望子元素的创建是即将成为父元素的实例方法,并将子元素(来自 Element 构造函数)作为唯一的形式参数。 实际: #!/usr
我是一名优秀的程序员,十分优秀!