【问题标题】:Python lxml - find tag block ammendPython lxml - 查找标记块修正
【发布时间】:2015-03-06 06:17:36
【问题描述】:

我有以下已打开并解析的 xml,我现在需要找到区域为 'IE' 的特定产品块,然后修改其 '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>

【问题讨论】:

    标签: python xml xml-parsing tags lxml


    【解决方案1】:

    您可以创建一个 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 用于区域=“IE”:

    true
    1
    

    【讨论】:

    • 如何修改值而不是打印 product.findtext?
    • @speedyrazor 你的意思是改变元素的文本值吗?
    • 是的,例如,将批发价格层值更改为 7。
    • @speedyrazor 应该是product.find('x:wholesale_price_tier').text = '7'。然后,您需要转储树以查看更改。
    • 抱歉,现在无法在更新之前检查批发价格层是否存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2018-06-02
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多