我在python中通过Element Tree解析类似XML的文件,并将内容写入pandas数据帧。
我目前面临以下问题:对于不同的标签,子标签的存在将是不同的。这对于提到here的解决方案来说不是问题。然而,复杂的部分是一些标签有重复的儿童标签,而其他标签没有。例如,第一个产品标签有两个(不同的)商品编号和两个相同的product_types(重复),而第二个产品标签只有一个。
<main>
<product>
<article_nr>B00024J7C6</article_nr>
<article_nr>44253</article_nr>
<product_type>x</product_type>
<product_type>x</product_type>
</product>
<product>
<article_nr>B00024J7C7</article_nr>
<product_type>y</product_type>
</product>
</main>
我想做的是: 1.)删除&quot; product_type&#39;的重复项。和 2.)如果不存在第二个article_nr则设置值NULL,否则取值。
到目前为止我的代码:
def create_dataframe(data):
df = pd.DataFrame(columns=('article_nr', 'article_nr2', 'product_type', 'product_type2','product_type2'))
for i in range(len(data)):
obj = data.getchildren()[i].getchildren()
row = dict(itertools.izip(['article_nr', 'article_nr2', 'product_type', 'product_type2','product_type2'],
[obj[0].text, obj[1].text, obj[2].text, obj[3].text, obj[4].text]))
row_s = pd.Series(row)
row_s.name = i
df = df.append(row_s)
return df
这适用于第一个示例,但显然不适用于第二个示例,因为第二个&#39; article_nr&#39;没有值。和&#39; product_type&#39;。
输出应为:
article_nr article_nr product_type
B00024J7C6 44253 x
B00024J7C7 NULL y
答案 0 :(得分:2)
看看Python remove duplicate elements from xml tree,也许它可以帮到你。 有些事情是这样的:
import xml.etree.ElementTree as ET
path = 'in.xml'
tree = ET.parse(path)
root = tree.getroot()
prev = None
def elements_equal(e1, e2):
if type(e1) != type(e2):
return False
if e1.tag != e1.tag: return False
if e1.text != e2.text: return False
if e1.tail != e2.tail: return False
if e1.attrib != e2.attrib: return False
if len(e1) != len(e2): return False
return all([elements_equal(c1, c2) for c1, c2 in zip(e1, e2)])
for page in root: # iterate over pages
elems_to_remove = []
for elem in page:
if elements_equal(elem, prev):
print("found duplicate: %s" % elem.text) # equal function works well
elems_to_remove.append(elem)
continue
prev = elem
for elem_to_remove in elems_to_remove:
page.remove(elem_to_remove)
tree.write("out.xml")