1.1Xpath介绍
- xpath是一种XML解析语言(我们熟悉的HTML其实是XML的一个子集),它提供了100多个内建函数。
- 几乎所有的语言都能使用xpath进行数据解析
- 其他XML解析语言:Beautifulsoup,lxml,DOM,SAX,JSDOM…
与其他爬虫解析技术相比:
提取技术 | 速度 | 难易程度 |
---|---|---|
Xpath | 快 | 中等 |
re | 最快 | 困难 |
bs4 | 慢 | 容易 |
1.2Xpath语法
-
层级:
表达式 意义 eg 说明 // 从全局选取节点,只要符合,任意位置都可 //div 选取html页面中的所有div节点 / 选取某个节点下的子节点 //head/title 选取head下的title节点 . 选取当前节点 ./a 选取当前节点下的所有a标签 -
属性:
表达式 意义 eg 说明 @ 选取符合属性的节点 //div[@id];//div[@id=‘1’] 选取带有id属性的所有div节点;选取属性id值为1的所有div节点 //@ 选取属性 //@lang 选取所有名为lang的所有属性 -
通配符:
表达式 意义 eg 说明 * 选取任意节点 //div[@id=‘1’]/* 选取id为1的div节点下的所有节点 | 相当于或与和的意义 //div|//meta 选取所有的div节点和所有的meta节点,只要满足其中一个都会被选取 [@*] 选取带有属性的节点 //a[@*] 选取所有带有属性的a标签节点 -
函数(常用):
表达式 意义 eg 说明 position() 筛选节点 //head/meta[position()< 3] 选取所有head节点下的前两个节点 last() 选取最后一个节点 //head/meta[last()] 选取所有head节点下的最后一个meta节点 [k] 选取第k个节点 //head/meta[k] 选取所有head节点下的第k个节点 contains() 选取节点属性中包含某内容的节点 //div[contains(@id,‘in’)] 选择属性id中包包含’in’的所有div节点 starts-with() 选取属性值开头为某内容的节点 //div[starts-with(@id,‘in’)] 选择属性id开头为’in‘的所有div节点 注意:在xpath中,标签的下标从1开始,与我们所学编程语言中如数组,列表等下标从0开始不一样,所以当我们用xpath选取第k个节点为[k]
1.3Xpath实战(python爬虫)
此处以4399小游戏为例:
准备工作:
-
安装lxml库(我们需要使用到lxml中的etree模块):
pip3 install lxml
-
导入lxml库的etree模块:
from lxml import etree
-
访问4399并取得该html页面:
import requests url = 'https://www.4399.com/' res = requests.get(url) #4399html中编码格式为gb2312.而requests中取得的html编码格式默认为utf-8 res.encoding = 'gb2312' html = res.text
-
调用HTML类对HTML文本进行初始化,成功构造XPath解析对象,同时可以自动修正HMTL文本(标签缺少闭合时会自动添加上):
html = etree.HTML(html)
-
数据提取:
我们先按下F12出现调试界面,按住ctrl+shift+c选择页面中我们需要提取元素,此时将跳转至该元素的节点位置,我们按下ctrl+F出现搜索框,我们在此搜索框内输入节点的xpath进行测试是否正确:
在确定好节点元素的xpath后在我们的python中进行数据提取:
list = []
lis = html.xpath('//div[@class="box_c"]/div[2]/ul/*')
for li in lis:
name = li.xpath('./a/text()')
list.append(name[0])
print(list)
注意:在上方python代码中,name即li.xpath返回值为一个列表
- 输出结果