添加带有文本的附加 xml 标签时出现 ValueError

ValueError when adding additional xml tags with text

我是 Python 的新手,有一个 file.xml 结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <PRODUCT_DETAILS>
        <DESCRIPTION_SHORT>green cat w short hair</DESCRIPTION_SHORT>
        <DESCRIPTION_LONG>green cat w short hair and unlimitied zoomies</DESCRIPTION_LONG>
    </PRODUCT_DETAILS>
    <PRODUCT_FEATURES>
        <FEATURE>
            <FNAME>Hair</FNAME>
            <FVALUE>medium</FVALUE>
        </FEATURE>
        <FEATURE>
            <FNAME>Colour</FNAME>
            <FVALUE>green</FVALUE>
        </FEATURE>
        <FEATURE>
            <FNAME>Legs</FNAME>
            <FVALUE>14</FVALUE>
        </FEATURE>
    </PRODUCT_FEATURES>
</HEADER>

我使用这个代码:

from lxml import etree as et
import pandas as pd

xml_data = et.parse('file.xml')
products = xml_data.xpath('//HEADER')

headers=[elem.tag for elem in xml_data.xpath('//HEADER[1]//PRODUCT_DETAILS//*')]
headers.extend(xml_data.xpath('//HEADER[1]//FNAME/text()'))

rows = []

for product in products:

    row = [product.xpath(f'.//{headers[0]}/text()')[0],product.xpath(f'.//{headers[1]}/text()')[0]]
    f_values = product.xpath('.//FVALUE/text()')
    row.extend(f_values)    
    rows.append(row)

df = pd.DataFrame(rows,columns=headers)

df
# df.to_csv("File_Export_V1.csv", index=False)

接收此输出:

    DESCRIPTION_SHORT       DESCRIPTION_LONG                                Hair    Colour  Legs
0   green cat w short hair  green cat w short hair and unlimited zoomies    medium  green   14

当我编辑 file.xml 并添加如下新行时:

<PRODUCT_DETAILS>
    <DESCRIPTION_SHORT>green cat w short hair</DESCRIPTION_SHORT>
    <DESCRIPTION_LONG>green cat w short hair and unlimited zoomies</DESCRIPTION_LONG>
    <BUYER_PID type="supplier_specific">100000000</BUYER_PID>
</PRODUCT_DETAILS>

我收到这些错误:

AssertionError: 6 columns passed, passed data had 5 columns
ValueError: 6 columns passed, passed data had 5 columns

我的大部分代码都是精心策划的,所以我不是 100 做什么(非常新)。 我必须调整代码的哪一部分来解决这些变化?我想保持输出结构。

谢谢! ~C

该错误是由于列数发生了变化(由于您将 <BUYER_PID type="supplier_specific">100000000</BUYER_PID> 子节点添加到 <PRODUCT_DETAILS>),而没有调整您的项目数row变量。

因此,如果您将该变量更改为:

row = [pet.xpath(f'.//{headers[0]}/text()')[0],pet.xpath(f'.//{headers[1]}/text()')[0],pet.xpath(f'.//{headers[2]}/text()')[0]]

错误应该会消失。