如果我使用:
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')]
是否可以访问已搜索文本的网页元素?
答案 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>