archivo de analizar XML elementtree - problema con el análisis

votos
0

Tengo un problema al analizar los datos de un archivo XML. Estoy usando xml.etree.ElementTree para extraer datos de archivos y guardarlos en .csv. Tengo todos los módulos necessery instalado en el servidor. Soy consciente de que hay módulo bs4 con BeutifulSoup, sin embargo, me gustaría saber si es posible analizar este archivo de datos / xml utilizando elementtree . Lo siento si la answear es fácil ni obvia, sin embargo, sigo siendo en gran medida un principiante y con este problema que no podía nombrar el problema de una manera de encontrar un answear.

Mientras se ejecuta un script en Python escrito continuación no tengo errores y sin resultado. Realmente no sé lo que debo cambiar. No puedo encontrar la solución. He intentado utilizar diferentes child.tag o atributos, pero sin resultado.

El archivo XML que tengo un problema con .:

<?xml version=1.0 encoding=utf-8?>
<offer file_format=IOF version=2.6 extensions=yes xmlns=http://www.iai-shop.com/developers/iof.phtml>
    <product id=9 vat=23.0 code_on_card=BHA>
      <producer id=1308137276 name=BEAL/>
      ...
      <price gross=175 net=142.28/>
      <sizes>
        <size code_producer=3700288265272 code=9-uniw weight=0>
          <stock id=0 quantity=-1/>
          <stock id=1 quantity=4/>
        </size>
      </sizes>
    </product>
    <product>
              ...
    </product>
              ...

y el guión que he tratado de utilizar (en este caso para extraer code_on_card, neto precio, cantidad).

(Soy consciente de que hay dos niño: valores y cantidad, y estoy completamente bien con el segundo overwrting la primera)

import requests
import os,sys
import csv
import xml.etree.ElementTree as ET

reload(sys)
sys.setdefaultencoding('utf-8')

xml_path = '/file.xml'

xml = ET.parse(xml_path)

with open('/home/file.csv', 'wb') as f:
    c = csv.writer(f, delimiter=';')
    for product in xml.iter('product'):
    product_id = product.attrib[code_on_card]
        for child in product:
            if child.tag == 'price':
                if child.attrib[net] != None:
                    hurt_net = child.attrib[net]
        for size in product.iter('size'):
            for stock in size.iter('stock'):
                if 'quantity' in stock.attrib.keys():
                    quantity = stock.attrib[quantity]

        line = product_id, hurt_net, quantity
        c.writerow(line)

Los archivos que me parecen basarse en el trabajo esquema similar bien (oferta -> productos -> niño / attrib), como éste:

<?xml version=1.0 encoding=UTF-8?>
<offer file_format=IOF version=2.5>
    <product id=2>
        <price gross=0.00 net=0.00 vat=23.0/>
        <srp gross=0.00 net=0 vat=23.0/>
        <sizes>
            <size id=0  code=2-0  weight=0 >
            </size>
        </sizes>
    </product>
        ...
    </product>
        ...

EDIT: Resultado debe .csv que contiene filas multpile (cada uno para cada producto en el archivo xml) de code_on_card, neto precio, cantidad. Debe quedar como:

BC097B.50GD.O;70.81;37
BC097B.50.A;76.75;24
BC086C.50.B;76.75;29
BGRT.L;3;96.75;28
....

Edit2 código, ya que es, después de answear drec4s:

import requests
import os,sys
import csv
import xml.etree.cElementTree as ET

reload(sys)
sys.setdefaultencoding('utf-8')

xml_path = '/home/platne/serwer16373/dane/z_hurtowni/pobrane/beal2.xml'

root = ET.parse(xml_path)

ns = {'offer': 'http://www.iai-shop.com/developers/iof.phtml'}

products = root.getchildren()

with open('/home/platne/serwer16373/dane/z_hurtowni/stany_magazynowe/karol/bealKa.csv', 'wb') as f:
    c = csv.writer(f, delimiter=';')
    hurtownia = 'beal'
    for product in root.iter('product'):
        qtt = [1]
        code = product.get('code_on_card')
        hurt_net = product.find('price').get('net')
        for stock in product.find('sizes').find('size').getchildren():
            qtt.append(stock.get('quantity'))
        quantity = max(qtt)


        line = 'beal-'+str(code), hurt_net, quantity
        c.writerow(line)

de alguna manera me estoy poniendo AttributeError: objeto 'elementtree' no tiene atributo 'getChildren' Tengo Ele

Publicado el 07/11/2018 a las 22:41
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

Así es como me gustaría ir y analizar un xmlarchivo con espacios de nombres. Según la documentación oficial , la forma más fácil es definir una dictionaryespecificación del espacio de nombres.

from xml.etree import cElementTree as ET

root = ET.fromstring("""
<offer file_format="IOF" version="2.6" extensions="yes" xmlns="http://www.iai-shop.com/developers/iof.phtml">
    <product id="9" vat="23.0" code_on_card="BHA">
      <producer id="1308137276" name="BEAL"/>
      <price gross="175" net="142.28"/>
      <sizes>
        <size code_producer="3700288265272" code="9-uniw" weight="0">
          <stock id="0" quantity="-1"/>
          <stock id="1" quantity="4"/>
        </size>
      </sizes>
    </product>
</offer>
""")

ns = {'offer': 'http://www.iai-shop.com/developers/iof.phtml'}

products = root.getchildren()

for p in products:
    qtt = [] #to store all stock quantities
    product_id = p.get('code_on_card')
    hurt_net = p.find('offer:price', ns).get('net')
    for stock in p.find('offer:sizes', ns).find('offer:size', ns).getchildren():
        qtt.append(int(stock.get('quantity')))

    quantity = max(qtt) #or sum

line = (product_id, hurt_net, quantity)
print(line)

salidas:

('BHA', '142.28', 4)

Además, yo no entendía lo que era la cantidad de existencias que se necesitaba para extraer, ya que sólo estaba recibiendo los últimos hijos ( stock) Valor (cambiar la sumfunción para maxo para lo que sea necesario).

Respondida el 08/11/2018 a las 00:12
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more