遍历XML提取属性到JSON时timestamp与body重复问题排查
问题原因
你代码里的内层循环用了root.iter('revision'),这会遍历整个XML文档里的所有revision节点,而非当前page节点下的子节点。每次循环时,dictionary["timestamp"]和dictionary["body"]会被不断覆盖,直到遍历完所有revision,最终所有条目都会使用最后一个revision的内容,所以每个title对应的这两个字段都相同。
解决方法
需要从当前遍历的page节点下去查找对应的revision,而非从根节点root查找。同时根据需求分两种处理方式:
方式1:每个page只取最后一个revision(最新版本)
如果每个page仅需保留最新的revision数据,直接获取当前page下的revision节点并取最后一个即可:
if __name__ == "__main__": path = 'local path' tree = ET.parse(path) root = tree.getroot() with open("C:/Users/User/Documents/Github/News-Corpus/corpus.json", "w") as f: for page in tqdm(root.findall('page')): title = page.find('title').text dictionary = {"title": title} # 从当前page下获取所有revision节点 revisions = page.findall('revision') if revisions: # 取最后一个revision(对应最新版本) latest_rev = revisions[-1] dictionary["timestamp"] = latest_rev.find('timestamp').text dictionary["body"] = latest_rev.find('text').text f.write(json.dumps(dictionary)) f.write("\n")
方式2:每个revision生成一条JSON条目
如果每个page下的每个revision都需要单独生成一条JSON记录,就在遍历当前page的revision时直接写入文件:
if __name__ == "__main__": path = 'local path' tree = ET.parse(path) root = tree.getroot() with open("C:/Users/User/Documents/Github/News-Corpus/corpus.json", "w") as f: for page in tqdm(root.findall('page')): title = page.find('title').text # 遍历当前page下的所有revision节点 for revision in page.findall('revision'): dictionary = { "title": title, "timestamp": revision.find('timestamp').text, "body": revision.find('text').text } f.write(json.dumps(dictionary)) f.write("\n")
内容的提问来源于stack exchange,提问作者eneko valero
相关产品推荐
相关产品推荐

