简体   繁体   中英

Python and products file XML

I'm using python and I need to find sku , min-order-qty and step-quantity for each occurence of sku .

Input file is:

<product sku="1235997403">
  <sku>1235997403</sku>
  <name xml:lang="fr-FR">Huile pour entretien des destructeurs de documents HSM</name>
  <short-description xml:lang="fr-FR">Flacon 250 ml. Colis de 1 flacon.</short-description>
  <category-links>
    <category-link name="20319647o.rjpf_20320074o.rjpf" domain="RAJA-FR-WEB-0092-21" default = "1" hotdeal = "0"/>
  </category-links>
  <online>1</online>
  <quantity unit="pcs">
    <min-order-quantity>1</min-order-quantity>
    <step-quantity>1</step-quantity>
  </quantity>
....
</product>
....

I try to use lxml but fail to get min-order-qty and step-quantity

from lxml import etree
tree = etree.parse('./ST2CleanCourt.xml')
elem = tree.getroot()
for  child in elem:
        print (child.attrib["sku"]) 

I tried to use the 2 solutions below. It works but I need to read the file so I write

from lxml import etree
import codecs
f=codecs.open('./ST2CleanCourt.xml','r','utf-8')
fichier = f.read()
tree = etree.fromstring(fichier)

for child in tree:
    print ('sku:', child.attrib['sku'])
    print ('min:', child.find('.//min-order-quantity').text)

and I always get this error print ('min:', child.find('.//min-order-quantity').text) AttributeError: 'NoneType' object has no attribute 'text'

what is wrong ?

You can use the xpath method to get the required values.

Example:

from lxml import etree

a = """<product sku="1235997403">
  <sku>1235997403</sku>
  <name xml:lang="fr-FR">Huile pour entretien des destructeurs de documents HSM</name>
  <short-description xml:lang="fr-FR">Flacon 250 ml. Colis de 1 flacon.</short-description>
  <category-links>
    <category-link name="20319647o.rjpf_20320074o.rjpf" domain="RAJA-FR-WEB-0092-21" default = "1" hotdeal = "0"/>
  </category-links>
  <online>1</online>
  <quantity unit="pcs">
    <min-order-quantity>1</min-order-quantity>
    <step-quantity>1</step-quantity>
  </quantity>
</product>
"""

tree = etree.fromstring(a)
tags = tree.xpath('/product')

for b in tags:
    print b.attrib["sku"]
    min_order = b.xpath("//quantity/min-order-quantity")
    print min_order[0].text
    step_quality = b.xpath("//quantity/step-quantity")
    print step_quality[0].text

Output:

1235997403
1
1

Using more then 1 product and root node of products you can find this:

x = """
<products>
<product sku="1235997403">
  <sku>1235997403</sku>
  <name xml:lang="fr-FR">Huile pour entretien des destructeurs de documents HSM</name>
  <short-description xml:lang="fr-FR">Flacon 250 ml. Colis de 1 flacon.</short-description>
  <category-links>
    <category-link name="20319647o.rjpf_20320074o.rjpf" domain="RAJA-FR-WEB-0092-21" default = "1" hotdeal = "0"/>
  </category-links>
  <online>1</online>
  <quantity unit="pcs">
    <min-order-quantity>1</min-order-quantity>
    <step-quantity>1</step-quantity>
  </quantity>
</product>
<product sku="997403">
  <sku>1235997403</sku>
  <name xml:lang="fr-FR">Huile pour entretien des destructeurs de documents HSM</name>
  <short-description xml:lang="fr-FR">Flacon 250 ml. Colis de 1 flacon.</short-description>
  <category-links>
    <category-link name="20319647o.rjpf_20320074o.rjpf" domain="RAJA-FR-WEB-0092-21" default = "1" hotdeal = "0"/>
  </category-links>
  <online>1</online>
  <quantity unit="pcs">
    <min-order-quantity>5</min-order-quantity>
    <step-quantity>7</step-quantity>
  </quantity>
</product>
</products>
"""

from lxml import etree

tree = etree.fromstring(x) 
for  child in tree:
    print ("sku:", child.attrib["sku"])
    print ("min:", child.find(".//min-order-quantity").text)  # looks for  node below
    print ("step:" ,child.find(".//step-quantity").text)  # child with the given name

Essentially you look for any node below child that has the correct name and print its text.

Output:

sku:1235997403
min:1
step:1
sku:997403
min:5
step:7 

Doku: http://lxml.de/tutorial.html#elementpath

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM