【问题标题】:Python extract nodes containing tag using ElementTreePython使用ElementTree提取包含标签的节点
【发布时间】:2013-09-05 18:57:03
【问题描述】:

如果其中一个包含关键字,我需要从 XML 中提取几个节点。最后,我要指出如果找到关键字,我将在哪里打印。现在是棘手的部分(至少对我来说;-))。我将在下面更详细地解释它。 XML:

<?xml version="1.0"?>
<ItemSearchResponse xmlns="http://url">
  <Items>
    <Item>
      <ItemAttributes>
        <ListPrice>
          <Amount>2260</Amount>
        </ListPrice>
      </ItemAttributes>
      <Offers>
        <Offer>
          <OfferListing>
            <Price>
              <Amount>1853</Amount>
            </Price>
          </OfferListing>
        </Offer>
      </Offers>
      <Offers>
        <Offer>
          <OfferListing>
            <Price>
              <Amount>1853</Amount>
            </Price>
          </OfferListing>
        </Offer>
      </Offers>
      <Offers>
        <Offer>
          <OfferListing>
            <Price>
              <Amount>1200</Amount>
            </Price>
          </OfferListing>
        </Offer>
      </Offers>
    </Item>
  </Items>
</ItemSearchResponse>

如果找到并且 == 1853,我的脚本会打印出金额值。我真正需要的是:找到 1853 时 - 脚本应该将整个 &lt;Offers&gt; 提取到新文件中。我让脚本运行并卡住了。我真的不知道如何从&lt;Amount&gt; 回来并复制整个&lt;Offers&gt; 组。

脚本 1:

import xml.etree.ElementTree as ET
import sys

name = str.strip(sys.argv[1])
filename = str.strip(sys.argv[2])

fp = open("sample.xml","r")
element = ET.parse(fp)

for elem in element.iter():
    if elem.tag == '{http://url}Price':
        output = {}
        for elem1 in list(elem):
            if elem1.tag == '{http://url}Amount':
                if elem1.text == name:
                    output['Amount'] = elem1.text
                    print output

我的输出:

python sample1.py '1853' x
{'Amount': '1853'}
{'Amount': '1853'}

这里的“x”无关紧要。

如何从&lt;Amount&gt; 返回并将整个&lt;Offers&gt; 组复制到一个新文件或打印出来。需要用 ElementTree 来完成。

【问题讨论】:

  • 只有 ElementTree?因为这个包pythonhosted.org/pyquery做这种想法很有趣,它是一个类似jquery的系统
  • 我在这里仅限于标准:/

标签: python xml xpath elementtree


【解决方案1】:

这个呢:

import xml.etree.ElementTree as ET
import sys

name = str.strip(sys.argv[1])
filename = str.strip(sys.argv[2])

fp = open("sample.xml","r")
tree = ET.parse(fp)
root = tree.getroot()

for offers in root.findall('.//{http://url}Offers'):
    value_found = False
    for amount in offers.findall('.//{http://url}Amount'):
        if amount.text == name:
            value_found = True
            break
    if value_found:
        print ET.tostring(offers)

打印

<url:Offers xmlns:url="http://url">
    <url:Offer>
      <url:OfferListing>
        <url:Price>
          <url:Amount>1853</url:Amount>
        </url:Price>
      </url:OfferListing>
    </url:Offer>
  </url:Offers>

<url:Offers xmlns:url="http://url">
    <url:Offer>
      <url:OfferListing>
        <url:Price>
          <url:Amount>1853</url:Amount>
        </url:Price>
      </url:OfferListing>
    </url:Offer>
  </url:Offers>

要写入文件,您可以执行以下操作:(借用自 this answer

for i, offers in enumerate(root.findall('.//{http://url}Offers'), start=1):
    value_found = False
    for amount in offers.findall('.//{http://url}Amount'):
        if amount.text == name:
            value_found = True
            break
    if value_found:
        tree = ET.ElementTree(offers)
        tree.write("offers%d.xml" % i,
           xml_declaration=True, encoding='utf-8',
           method="xml", default_namespace='http://url')

写入文件如下:

<?xml version='1.0' encoding='utf-8'?>
<Offers xmlns="http://url">
    <Offer>
      <OfferListing>
        <Price>
          <Amount>1853</Amount>
        </Price>
      </OfferListing>
    </Offer>
  </Offers>

【讨论】:

  • 不是这样的。我正在寻找金额为 1853 的报价。如果找到,我需要将带有子节点的整个 提取到新文件中。因此,当给出 1853 时,应提取两组 - 18531853。我也想知道 xml.dom,但我不确定我在这里是否以正确的方式思考
  • 我的错。我删除了第二次休息并调用了 ET.tostring(offers)
  • 是的,这简直太完美了!我知道我仍然需要了解枚举才能完全理解这件事,但是 - 非常感谢!这是一个很大的帮助!
  • @jakkolwiek, enumerate() 只是一个非常简洁的循环计数助手。我最近最大的发现是“开始”参数;)
  • 实际上我仍然没有得到任何东西...假设在我的源 xml 中,有大约 300 个 标记的值 = 1853。它们都在终端中很好地打印,但在文件中只写最后一个标签。我也尝试将字符串流式传输到文件,但仍然无法正确处理。仍然 - 在终端中一切都很好,但在文件中只有最后一条记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2021-11-24
  • 1970-01-01
  • 2020-11-01
  • 2022-01-23
  • 2015-05-11
  • 2012-04-29
相关资源
最近更新 更多