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

时间:2010-08-21 16:50:52

标签: python html parsing lxml

我希望我说得对。我试图找出element.sourceline的作用,以及是否有某些方法可以使用它的功能。我尝试过多种方式从html构建我的元素,但每次迭代我的元素并询问sourceline我总是得到None。当我尝试使用内置帮助时,我也没有得到任何东西。

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

我知道这是一种元素而不是树木的方法,但这是我能够提出的最佳方法。

回应吉姆加里森的一个例子的要求

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)

当我运行此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)]

当我和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)]

但我的源htm太乱了我不能用etree来探索这棵树 我收到错误

1 个答案:

答案 0 :(得分:3)

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

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