【问题标题】:How to save a list of lxml.etree._ElementTree to file如何将 lxml.etree._ElementTree 列表保存到文件
【发布时间】: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


    【解决方案1】:

    好的,在尝试了我能找到的所有东西之后,我想出了如何完成这项工作,需要使用 parse 而不是 tostring:

    trees_to_save = [{'tree': lxml.etree.tostring(tree,encoding='utf-8',method='html')} for tree in trees]
    t2sdf = pd.DataFrame(trees_to_save)
    t2sdf.to_csv('location_trees.csv')
    
    trees_from_file = pd.read_csv('location_trees.csv')
    EncodeForamt = lxml.etree.HTMLParser(encoding='utf-8')
    trees_from_file['tree'] = trees_from_file['tree'].apply(lambda x: lxml.etree.parse(x,parser=EncodeForamt))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多