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 = ‘’’
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文档中所有的节点,其中星号( *)表示所有的节点。当然,’//‘后面还可以跟更多的规则,例如,要选取所有的
本例使用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)