当前位置: 首页 > 知识库问答 >
问题:

使用XPath[duplicate]进行Python XML过滤

欧阳永宁
2023-03-14

我在努力让这东西工作。我有一个XML文件,我需要使用XPath过滤元素“标题”。之后,我需要将C元素下的所有内容复制到外部文件,但这不是现在的重点。我需要让这个运行使用xml.etree.cElementTree或xml.etree.ElementTree。我已经在stackoverflow和其他网站上读了一大堆帖子,然后卡住了。秀...首先是XML结构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<delivery xmlns="http://url" publicationdate="2013-08-28T09:10:32Z">
    <A>
        <B>
            <C>
                <Cid>XXXXXXXXX</Cid>
                <cref>111111-2222222</cref>
                <D>
                    <E/>
                    <F/>
                    <G/>
                    <H>
                        <Href>XXXXXXXXXXXX</Href>
                        <hcont name="XXXXXX" country="EN"/>
                    </H>
                    <I/>
                    <J/>
                    <K>XXXXXXXXX</K>
                    <oldK>XXXXXXX</oldK>
                    <title>
                        <content lang="en">TITLE</content>
                    </title>
                    <L>
                        <isL>false</isL>
                    </L>
                </D>
                <M>
                    <startTime>2013-08-28T03:00:00Z</startTime>
                    <endTime>2013-08-29T00:58:00Z</endTime>
                </M>
            </C>
        </B>
    </A>
</delivery>

我甚至不能通过XPath找到Cid元素。脚本不断返回'无'或[]或什么都不返回。

import xml.etree.ElementTree as ET

doc = ET.ElementTree(file='short.xml') 
for x in doc.findall('./A/B/C'):
  print x.get('Cid').text

这个什么也不退。如何让它工作?如何“找到”甚至Cid元素?

共有1个答案

张亦
2023-03-14

您应该将名称空间参数传递给findall()

namespaces = {name_space_name_here: 'http://url'}
for x in doc.findall('./A/B/C', namespaces=namespaces):
    # do smth

不过,这在默认命名空间中不起作用(就像您的情况一样,只是xmlns)。

在这种情况下,可以显式地将命名空间传递给xpath:

for x in tree.findall('.//{%(uri)s}C' % {'uri': 'http://url'}):

另见:

  • 在Python中通过'ElementTree'解析带有命名空间的XML
  • ElementTree:使用命名空间和限定名称
 类似资料:
  • Xpath( XML Path Language, XML路径语言),是一种在 XML 数据中查找信息的语言,现在,我们也可以使用它在 HTML 中查找需要的信息。 既然谈到 Xpath 是一门语言,当然它就会有自己的一些特定的语法。我们这里罗列一些经常使用的语法,熟悉下面的基本语法之后,就能满足我们日常的爬虫开发所用。 本小节主要内容: Xpath的基本概念 Xpath的基本语法 Xpath实战

  • 我想选择所有@number has category=“a”我尝试使用//@number[@category/text()='a'],但它似乎不起作用,所以我如何获得它

  • 我明白为什么第三个和第四个输出打印真和假。这是因为返回一个对象,包装类缓存值在-128到127范围内的对象。如果向传递了该范围内的任何值,则它应该重用缓存中的对象。否则,它将创建一个新对象。 现在,为什么第二个输出打印出false?我以为返回一个原语,而不是像那样返回一个对象。

  • 我尝试使用 在此输入图像描述 如果我打印出来,我会得到: 我想:“荷兰人在中国的问题。”

  • 问题内容: 我正在使用Node.js进行一些Web抓取。我想使用XPath,因为我可以使用几种GUI半自动生成它。问题是我找不到有效的方法。 非常慢。它会在一分钟左右的时间内解析500KiB文件,并具有完整的CPU负载和大量内存。 流行的HTML解析库(例如)既不支持XPath,也不公开W3C兼容的DOM。 很明显,有效的HTML解析是在WebKit中实现的,因此可以使用或将其作为一种选择,但这些

  • 全部的 我有多个XML模板,我需要填充数据,以允许我的文档生成器类使用多个模板并正确插入数据 我通过添加一个属性来指定我希望类插入数据的节点: id=“根” XML的一个例子 密码 使用以下示例:XPath按属性值选择元素 表达式不起作用: //SiebelMessage[@id='root'] 知道我做错了什么吗?