使用LXML和XPATH解析后显示完整路径

时间:2019-01-25 04:14:12

标签: python xpath lxml

有没有一种显示方式: (a)到定位节点的完整路径? (b)显示路径节点的属性,即使我不知道这些属性可能被称为什么?

例如,给定页面:

<!DOCTYPE html>
<HTML lang="en">
<HEAD>
  <META name="generator" content=
    "HTML Tidy for HTML5 for Linux version 5.2.0">
  <META charset="utf-8">
  <TITLE>blah ombid lipsum</TITLE>
</HEAD>
<BODY>
  <P>I'm the expected content</P>
  <DIV unexpectedattribute="very unexpected">
    <P>I'm wanted but not where you thought I'd be</P>
    <P class="strangeParagraphType">I'm also wanted text but also mislocated</P>
  </DIV>
</BODY>
</HTML>

我可以通过

找到需要的文本
# Import Python libraries
import sys
from lxml import html

page = open( 'findme.html' ).read()
tree  = html.fromstring(page)

wantedText = tree.xpath(
  '//*[contains(text(),"wanted text")]' )

print( len( wantedText ), ' item(s) of wanted text found')

但是找到了它,我希望能够打印出所需文本位于以下事实: /HTML/BODY/DIV/P ...或什至更好地证明它位于/HTML/BODY/DIV/P[2] ...更好地证明它位于该位置,其中/DIV具有unexpectedattribute="very unexpected",最后一个<P>具有strangeParagraphType类。

1 个答案:

答案 0 :(得分:0)

对于您拥有的第一个示例,可以使用类似的方法:

['/'.join(list([wt.tag] + [ancestor.tag for ancestor in wt.iterancestors()])[::-1]).upper() for wt in wantedText]

可以使用元素对象上的attrib属性和一些自定义逻辑来创建第三种方法:

wantedText[0].getparent().attrib
>>> {'unexpectedattribute': 'very unexpected'}
wantedText[0].attrib
>>> {'class': 'strangeParagraphType'}

编辑:顶部的重复答案链接绝对是一种更好的选择。