Xpath解析器:

# 效率很高 使用广泛

"""

该选择器可以做到一句话完成多步操作

"""

# 1.导入Xpath所在模块

from lxml import etree

# 2.将带匹配的文本传入etree生成一个对象

html = etree.HTML(doc)

# 3.Xpath解析器主要功能如下:

# 1 所有节点

a = html.xpath('//*')   # 匹配所有的标签

# 2 指定节点(结果为列表)

a = html.xpath('//head')   # 匹配所有的head标签

# 3 子节点 子孙节点

a = html.xpath('//div/a')  # 匹配div标签内部所有的儿子a标签

a = html.xpath('//body/a')  # 没有符合条件的儿子a

a = html.xpath('//div//a')  # 匹配div标签内容所有的后代a标签

a = html.xpath('//body//a')  # 也可以匹配到

 

# 4 父节点

a=html.xpath('//body//a[@href="image1.html"]')  # 属性查找 获取body内部所有的href=image1.html后代a

a = html.xpath('//body//a[@href="image1.html"]/..')  # ..表示查找上一级父标签

a = html.xpath('//title[@id="t1"]/..')  # ..表示查找上一级父标签

a = html.xpath('//body//a[1]')  # 从1开始取值

''xpath选择器中中括号内部可以放属性也可以放位置数 从1开始'''

# 也可以这样(了解)

a = html.xpath('//body//a[1]/parent::*')

# 5 文本获取

a = html.xpath('//body//a[@href="image1.html"]/text()')

a = html.xpath('//body//a/text()')  # 获取body内部所有后代a内部文本(一次性获取不需要循环)

# 6 属性获取

a = html.xpath('//body//a/@href')  # 获取body内部所有后代a标签href属性值(一次性获取不需要循环)

a = html.xpath('//title/@id')  # 获取title标签id属性值

# # 注意从1 开始取(不是从0)

a = html.xpath('//body//a[2]/@href')

 

# 7 属性多值匹配

a 标签有多个class类,直接匹配就不可以了,需要用contains

a=html.xpath('//body//a[@class="li"]')  # 写等号就表示等于 不是包含

a = html.xpath('//body//a[contains(@class,"li")]/text()')  # 包含需要使用关键字contains

 

# 8 多属性匹配

'''查找body标签内部所有class含有li或者name=items的a标签'''

a = html.xpath('//body//a[contains(@class,"li") or @name="items"]')

'''查找body标签内部所有class含有li并且name=items的a标签的内部文本'''

a = html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')

 

# 9 按序选择

# 取最后一个

a = html.xpath('//a[last()]/@href')

# 位置小于3的

a = html.xpath('//a[position()<3]/@href')  # position()关键字 用于定位

# 倒数第三个

a = html.xpath('//a[last()-2]/@href')