У меня проблема с анализом данных из файла XML. Я использую xml.etree.ElementTree, чтобы извлечь данные из файлов и затем сохранить их в .csv. У меня все необходимые модули установлены на сервере.
Я знаю, что есть модуль bs4 с BeutifulSoup, , но я хотел бы знать, возможно ли проанализировать этот файл data / xml, используя ElementTree . Извините, если ответ прост или очевиден, но я все еще новичок, и с этой проблемой я не смог назвать проблему таким образом, чтобы найти ответ.
Во время работы скрипта Python, написанного ниже, у меня нет ошибок и нет результатов. Я действительно не знаю, что я должен изменить. Я не могу найти решение. Я пытался использовать другой child.tag или атрибуты, но безрезультатно.
XML-файл, с которым у меня проблема .:
<?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>
...
и скрипт, который я пытался использовать (здесь для извлечения code_on_card, цены нетто, количества).
(я знаю, что есть два ребенка: запас и количество, и я полностью в порядке со вторым, перезаписывающим первое)
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)
Файлы, которые мне кажутся построенными по аналогичной схеме, работают просто отлично (предложение -> продукт -> ребенок / атрибут), как этот:
<?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:
Результатом должен быть файл .csv, содержащий несколько строк (каждая для каждого продукта в xml-файле): code_on_card, цена нетто, количество. Это должно выглядеть так:
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
код, как есть, после 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)
как-то получаю
AttributeError: объект 'ElementTree' не имеет атрибута 'getchildren'
У меня есть Ele