任何人都有一个使用 lxml.html 中的 element.sourceline 方法的示例

PyN*_*bie 4 html python parsing lxml

我希望我问的是正确的。我试图弄清楚 element.sourceline 的作用以及是否有某种方法可以使用它的功能。我尝试过多种方式从 html 构建我的元素,但每次我迭代我的元素并请求源代码时,我总是得到 None 。当我尝试使用内置帮助时,我也没有得到任何结果。

我用谷歌搜索了一个例子,但还没有找到。

我知道这是一种元素方法而不是树方法,但这是我能想到的最好的方法。

回应吉姆·加里森(Jim Garrison)的示例请求

theTree=html.parse(open(r'c:\temp\testlxml.htm'))
check_source
the_elements=[(e,e.sourceline) for e in theTree.iter()]  #trying to get the sourceline
for each in the_elements:
    if each[1]!=None:
    check_source.append(each)
Run Code Online (Sandbox Code Playgroud)

当我运行这个 len(check_source)==0 时

我的 htm 文件有 19,379 行,所以我不确定你想看它

我尝试了一种解决方案

>>> myroot=html.fromstring(xml)
>>> elementlines=[(e,e.sourceline) for e in myroot.iter()]
>>> elementlines
[(<Element doc at 12bb730>, None), (<Element foo at 12bb650>, None)]
Run Code Online (Sandbox Code Playgroud)

当我对 etree 做同样的事情时,我得到了演示的结果

>>> myroot=etree.fromstring(xml)
>>> elementlines=[(e,e.sourceline) for e in myroot.iter()]
>>> elementlines
[(<Element doc at 36a6b70>, 1), (<Element foo at 277b4e0>, 2)]
Run Code Online (Sandbox Code Playgroud)

但我的源 htm 太混乱了,我无法使用 etree 来探索树,我收到错误

ars*_*ars 5

sourceline将返回解析文档时确定的行号。因此它不适用于通过 API 添加的元素。例如:

from lxml import etree

xml = '<doc>\n<foo>rain in spain</foo>\n</doc>'
root = etree.fromstring(xml)

print root.find('foo').sourceline # 2

root.append(etree.Element('bar'))
print etree.tostring(root)
print root.find('bar').sourceline # None
Run Code Online (Sandbox Code Playgroud)

我很确定这同样适用于lxml.html.