添加带有文本的附加 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]]
错误应该会消失。
我是 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]]
错误应该会消失。