【发布时间】:2017-11-07 22:22:04
【问题描述】:
我在使用 lxml 库时遇到了一个烦人的问题,不知道如何解决它。
我有一个 lxml.etree._ElementTree 树的列表和一个 lxml.html.HtmlElement 的列表,它们属于这些树,并且对应的路径存储在一个名为路径的列表中
element_found = [True if len(tree.xpath(path)) > 0 else False for tree,path in zip(trees,paths)]
print(element_found.count(False)) # == 0
当我尝试保存路径和树木以便稍后检索此状态时,问题就出现了:
trees_to_save = [{'tree': lxml.etree.tostring(tree, pretty_print=True)} for tree in trees]
t2sdf = pd.DataFrame(trees_to_save)
t2sdf.to_csv('trees.csv')
EncodeForamt = lxml.html.HTMLParser(encoding='utf-8')
trees_from_file = pd.read_csv('trees.csv')
trees_from_file['tree'] = trees_from_file['tree'].apply(lambda x: etree.HTML(literal_eval(x),EncodeForamt).getroottree())
然后运行相同的测试:
element_found = [True if len(tree.xpath(path)) > 0 else False for tree,path in zip(trees_from_file,paths)]
print(element_found.count(False)) # == 6 (out of 12k)
通常我试图完成所有找到的路径,显然存在与/从字符串方法以及我如何保存树的问题。我已经尝试了 lxml 库中的各种方法,例如 tree.write 而不是 string,而不是 literal_eval,只是 .encode('utf-8') 无济于事,有和没有 pretty_print,也尝试了 etree.from_string()一切的结果都是一样的......
令人担忧的是,这也会引发 XML 语法错误:
trees = [etree.fromstring(etree.tostring(t)) for t in trees]
我有点不知道如何正确保存这些树......
【问题讨论】:
标签: python lxml elementtree