Python lxml - 查找标签 block 修正

标签 python xml xml-parsing tags lxml

我已经打开并解析了下面的 xml,现在需要找到区域为“IE”的特定产品 block ,然后修改其“cleared_for_sale”和“wholesale_price_tier”值,但我不确定如何操作。这是不起作用的:

a = 0
territory = "IE"
for products22 in tree.xpath("//video/products/product"):
    node_video_temp = tree.xpath('//video/products/product')[a]
    if root.iterfind(node_video_temp, territory):
        ## Update the values ##
    a +=1

这是 xml:

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://apple.com/itunes/importer" version="film5.0">
    <video>
        <products>
            <product>
                <territory>GB</territory>
                <cleared_for_sale>true</cleared_for_sale>
                <wholesale_price_tier>1</wholesale_price_tier>
            </product>
            <product>
                <territory>IE</territory>
                <cleared_for_sale>true</cleared_for_sale>
                <wholesale_price_tier>1</wholesale_price_tier>
            </product>
            <product>
                <territory>US</territory>
                <cleared_for_sale>true</cleared_for_sale>
                <wholesale_price_tier>1</wholesale_price_tier>
            </product>
        </products>
    </video>
</package>

最佳答案

您可以创建一个 xpath 表达式来获取 territoryIE 的所有产品:

//product[territory = "IE"]

但是,您需要 handle an empty namespace这里:

from lxml import etree

data = """<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://apple.com/itunes/importer" version="film5.0">
    <video>
        <products>
            <product>
                <territory>GB</territory>
                <cleared_for_sale>true</cleared_for_sale>
                <wholesale_price_tier>1</wholesale_price_tier>
            </product>
            <product>
                <territory>IE</territory>
                <cleared_for_sale>true</cleared_for_sale>
                <wholesale_price_tier>1</wholesale_price_tier>
            </product>
            <product>
                <territory>US</territory>
                <cleared_for_sale>true</cleared_for_sale>
                <wholesale_price_tier>1</wholesale_price_tier>
            </product>
        </products>
    </video>
</package>
"""

ns = {"x": "http://apple.com/itunes/importer"}
territory = 'IE'

root = etree.fromstring(data)
for product in root.xpath('//x:product[x:territory = "%s"]' % territory, namespaces=ns):
    print product.findtext('x:cleared_for_sale', namespaces=ns)
    print product.findtext('x:wholesale_price_tier', namespaces=ns)

打印cleared_for_salewholesale_price_tier for Territory =“IE”:

true
1

关于Python lxml - 查找标签 block 修正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28893307/

相关文章:

xml - XML 元素可以同时包含文本和子元素吗?

python - 在Python中解析具有多个JSON对象的文件

java - Jackson List 帮助 - Java

javascript - 在 indesign 脚本中使用 xml 内容标记

mysql - 如何使用此 coldfusion 代码读取大型 XML 文件并将数据插入数据库?

xml - AJAX/Jquery XML 解析

python - 在 Python 和 Pandas 中使用 dd.mm.yyyy 读取 csv

python - 在扩展 python 中的内置函数时,你可以覆盖魔术方法吗?

python - 面向对象的Python程序

ruby - 如果我的 XML 文档指令指定 UTF-8 编码,我还需要转义字符吗?