Python3 网页解析库XPath用法

基本用法及注释

1
2
3
4
5
6
7
8
#安装
from lxml import etree

#初始化 text为某网页源码
html = etree.HTML(text)

#获取网页中需要的内容
url = html.xpath('//tbody[contains(@id,"normalthread")]/tr/th[contains(@class,"new")]/a[contains(@href,"viewthread")]/@href')

1、节点选择

html为树状结构,通过/来选取相应的节点:

1个/表示选取当前节点的直接子节点,//表示选取当前节点的所有子节点(相当页面上的所有节点)

1
2
3
4
5
6
7
8
#选取页面中所有的tbody标签
html.xpath('//tbody')

#选取页面中含有直接子节点tr的所有tbody标签
html.xpath('//tbody/tr')

#选取页面中的a标签,a标签的上级节点需要在tbody/tr/th下
html.xpath('//tbody/tr/th/a')

1个.表示选取当前节点,..表示选取当前节点的父节点

1
2
3
4
5
#等同于html.xpath('//a')
html.xpath('//a/.')

#选取所有a标签的父节点
html.xpath('//a/..')

2、文本获取

1
2
3
4
5
#获取a标签的直接子节点的文本
html.xpath('//tbody/tr/th/a/text()')

#获取a标签下的所有文本
html.xpath('//tbody/tr/th/a//text()')

3、属性获取

@表示选取属性

1
2
3
4
5
6
7
8
#获取a标签的直接子节点的href属性
html.xpath('//tbody/tr/th/a/@herf')

#获取a标签下的所有href属性
html.xpath('//tbody/tr/th/a//@herf')

#获取a标签的父节点的href属性
html.xpath('//tbody/tr/th/a/../@herf')

4、属性匹配

部分情况下标签可能需要进行筛选才能准确获取想要的信息

1
2
3
4
5
6
7
8
9
10
#指定tbody标签,id属性包含字符normalthread
#指定th标签,class属性包含new
#指定a标签,href属性包含viewthread
html.xpath('//tbody[contains(@id,"normalthread")]/tr/th[contains(@class,"new")]/a[contains(@href,"viewthread")]/@href')

#指定td标签,class属性包含t_f且id属性包含postmessage
html.xpath('//td[contains(@class,"t_f") and contains(@id,"postmessage")]//text()')

#指定td标签,class属性包含t_f且id属性等于postmessage
html.xpath('//td[contains(@class,"t_f") and @id="postmessage"]//text()')