lxml 将元素转换为elementtree

问题描述 投票:0回答:3

以下测试代码读取文件,并使用

lxml.html
生成页面 DOM/Graph 的叶节点。

但是,我也在尝试弄清楚如何从“字符串”获取输入。使用:

lxml.html.fromstring(s)

不起作用,因为这会生成

Element
而不是
ElementTree

所以,我想弄清楚如何将元素转换为ElementTree

[我的测试代码]

import lxml.html
from lxml import etree    # trying this to see if needed 
                          # to convert from element to elementtree


  #cmd='cat osu_test.txt'
  cmd='cat o2.txt'
  proc=subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE)
  s=proc.communicate()[0].strip()

  # s contains HTML not XML text
  #doc = lxml.html.parse(s)
  doc = lxml.html.parse('osu_test.txt')
  doc1 = lxml.html.fromstring(s)

  for node in doc.iter():
  if len(node) == 0:
     print "aaa ",node.tag, doc.getpath(node)
     #print "aaa ",node.tag

  nt = etree.ElementTree(doc1)        <<<<< doesn't work.. so what will??
  for node in nt.iter():
  if len(node) == 0:
     print "aaa ",node.tag, doc.getpath(node)
     #print "aaa ",node.tag

更新1:

(解析 html 而不是 xml) 添加了阿巴斯建议的更改。出现以下错误:

    doc1 = etree.fromstring(s)
  File "lxml.etree.pyx", line 2532, in lxml.etree.fromstring (src/lxml/lxml.etree.c:48621)
  File "parser.pxi", line 1545, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:72232)
  File "parser.pxi", line 1424, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:71093)
  File "parser.pxi", line 938, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:67862)
  File "parser.pxi", line 539, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:64244)
  File "parser.pxi", line 625, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:65165)
  File "parser.pxi", line 565, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64508)
lxml.etree.XMLSyntaxError: Entity 'nbsp' not defined, line 48, column 220

更新2:

设法让测试工作。我不太清楚为什么。如果有专业知识的人想要提供解释,这将有助于未来偶然发现这一点的人。

from cStringIO import StringIO
from lxml.html import parse

doc1 = parse(StringIO(s))

for node in doc1.iter():
    if len(node) == 0:
        print "aaa ", node.tag, doc1.getpath(node)

看来 StringIO 模块/类实现了 IO 功能,满足了解析包继续处理测试 html 的输入字符串所需的功能。也许类似于其他语言中提供的铸造功能...

python element lxml elementtree
3个回答
11
投票

要从

_Element
(使用
lxml.html.fromstring
生成)获取根树,可以使用
getroottree
方法:

doc = lxml.html.parse(s)
tree = doc.getroottree()

6
投票

etree.fromstring
方法解析 XML 字符串并返回根元素。
etree.ElementTree
类是一个元素的树包装器,因此需要一个元素来实例化。

因此,将根元素传递给

etree.ElementTree()
构造函数应该会给你你想要的:

root = etree.fromstring(s)
nt = etree.ElementTree(root)

1
投票

一个

_Element
,这样通过如下调用返回:

tree = etree.HTML(result.read(), etree.HTMLParser())

可以像这样制作

_ElementTree

tree    = tree.getroottree() # convert _Element to _ElementTree

希望这就是您所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.