如何查找文本的父节点?

时间:2016-02-20 08:08:57

标签: python parsing web-scraping python-requests lxml

如果我使用:

import requests
from lxml import html

response = request.get(url='someurl')
tree = html.document_fromstring(response.text)


all_text = tree.xpath('//text()')     # which give all text from page

在这个all_text列表中,我们有来自页面的所有文本。现在我想知道是否:

text_searched = all_text[all_text.index('any string which is in all_text list')]

是否可以访问已搜索文本的网页元素?

1 个答案:

答案 0 :(得分:0)

您可以使用 getparent() 方法,例如:

.....
.....
all_text = tree.xpath('//text()')

first_text = all_text[0]
parent_element = first_text.getparent()

print html.tostring(parent_element)

请注意getparent() might not be the one you expected的行为,以防当前文本元素位于同一父元素中的元素节点之后。由于lxml实施的树模型,在这种情况下,文本被视为前一个元素的tail而不是包含元素的child,因此getparent()将返回前面的元素。请参阅下面的示例,以清楚地了解我一直在谈论的内容:

from lxml import html
raw = '''<div>
    <span>foo</span>
    bar
</div>'''
root = html.fromstring(raw)
texts = root.xpath('//text()[normalize-space()]')
print [t for t in texts]
# output : ['foo', '\n\tbar\n']

[html.tostring(e.getparent()) for e in texts]
# output : ['<span>foo</span>\n\tbar\n', '<span>foo</span>\n\tbar\n']
# see that calling getparent() on 'bar' returns the <span> not the <div>