当前位置: 首页 > 工具软件 > lxml > 使用案例 >

lxml与XPath

彭鸿文
2023-12-01

XPath
lxml装载HTML代码有如下两种方式:
(1)从文件装载,通过parse函数指定HTML文件名。
(2)从代码装载,通过HTML函数指定HTML代码。
XPath语言的基本语法就是多级目录。
XPath的基本语法规则
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性
在lxml中使用XPath需要通过xpath函数指定XPath代码
lxmI中使用XPath过滤节点:
from lxml import etree
parser := etree.HTMLParser ()
tree = etree.parse ( ’ test .html’, parser)
titles = tree . xpath ( ’ /html/head/title ’ )
if len (titles) > 0:
print (titles[0].text)

#定义一段HTML代码
html = ‘’’

  • <'a href="https: //geekori.com"> geekori . com
  • 京东商城
  • 淘宝
'''

分析HTML代码

tree = etree.HTML (html)
aTags = tree . xpath ( "//li [@class='item2 ’ ] ")
if len (aTags) > 0:
print (aTags [0 ] [0] .get ('hre f ’ ) , aTags [0] [0] .text)

执行这段代码,会输出如下的结果。
https://www.jd.com 京东商城

通过阅读这段代码,应该注意如下两点:
(1)通过XPath定位节点返回的是节点集合,即使只有一个节点,返回的也是一个节点集合。
(2)使用XPath分析的HTML文档并不一定是标准的,可以没有像、 、 这些节点。任何一段符合HTML语法标准的代码都可以使用XPath进行定位。

选取所有节点
以2个斜杠( //)开头的XPath规则会选取所有符合要求的节点。如果使用’//*‘那么会选取整个HTML文档中所有的节点,其中星号( *)表示所有的节点。当然,’//‘后面还可以跟更多的规则,例如,要选取所有的

  • 节点,可以使用’//li’
  • 本例使用XPath选取demo.html文件中所有的节点以及所有的节点,并输出选取节点的名称。
    首先准备一个demo.html文件
    实例位置: src/xpath/demo.html
    < ! DOCTYPE html>

    选取所有节点的代码如下:
    实例位置: src/xpath/allnode.py
    from lxml import etree
    parser = etree.HTMLParser ()
    html = etree .parse ( ’ demo .html ‘, parser)
    nodes = html.xpath (’//*’)
    print( ‘共’,len (nodes) ,‘个节点’)
    print (nodes)
    for i in range (0,len (nodes) ) :
    print (nodes [i].tag,end=’ ’ )
    def printNodeTree (node, indent) :
    print (indent + node.tag)

 类似资料: