Python ElementTree解析xml文件-解析问题

Python ElementTree解析xml文件-解析问题,python,parsing,elementtree,Python,Parsing,Elementtree,我在解析xml文件中的数据时遇到问题。我正在使用xml.etree.ElementTree从文件中提取数据,然后将它们保存到.csv中。我在服务器上安装了所有必要的模块。 我知道有带BeutifulSoup的bs4模块,但是我想知道是否可以使用ElementTree来解析这个数据/xml文件。对不起,如果鞍衣很简单或明显,但我仍然是一个非常初学者,与这个问题,我无法命名的问题,以一种方式找到鞍衣 在运行下面编写的python脚本时,我没有错误,也没有结果。我真的不知道我应该改变什么。我找不到解决

我在解析xml文件中的数据时遇到问题。我正在使用xml.etree.ElementTree从文件中提取数据,然后将它们保存到.csv中。我在服务器上安装了所有必要的模块。 我知道有带BeutifulSoup的bs4模块,但是我想知道是否可以使用ElementTree来解析这个数据/xml文件。对不起,如果鞍衣很简单或明显,但我仍然是一个非常初学者,与这个问题,我无法命名的问题,以一种方式找到鞍衣

在运行下面编写的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>
              ...
在我看来,基于类似方案构建的文件工作正常(offer->product->child/attrib),如下所示:

<?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>
        ...
EDIT2 在drec4s answear之后按原样编码:

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

这就是我如何解析带有名称空间的
xml
文件的方法。根据,最简单的方法是定义一个指定名称空间的
字典

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)

另外,我不明白您需要提取的库存量是多少,因为您只获取最后一个子项(
stock
)值(将
sum
函数更改为
max
或您需要的任何值)。

这就是我如何使用名称空间解析
xml
文件的方法。根据,最简单的方法是定义一个指定名称空间的
字典

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)

另外,我不明白您需要提取的库存量是多少,因为您只获取最后一个子项(
stock
)值(将
sum
函数更改为
max
或任何您需要的值)。

这是因为默认名称空间(关于如何使用名称空间解析XML)。如果您添加了一个示例,说明输出应该是什么样子,这也会很有帮助。另一件有帮助的事情是按原样运行的代码(请参阅)。默认名称空间-我想就是这样-需要时间来理解它。这是因为默认名称空间(关于如何使用名称空间解析XML)。如果您添加了一个示例,说明您的输出应该是什么样子,这也会很有帮助。另一件很有帮助的事情是按原样运行的代码(请参阅)。默认名称空间-我想就是这样-需要时间来咬它。我想这是answear,但我似乎无法解决它。不知怎的,我得到了AttributeError:'ElementTree'对象没有属性'getchildren',我认为这是answear,但我似乎无法解决它。不知怎的,我得到了AttributeError:'ElementTree'对象没有属性'getchildren'
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)
('BHA', '142.28', 4)