一、环境配置
1、安装xpath
下载地址:百度网盘 请输入提取码
第一步:
下载好文件后会得到一个没有扩展名的文件,重命名该文件将其改为.rar或者.zip等压缩文件,解压之后会得到一个.crx文件和一个.pem文件。新建一个文件夹,将这两个文件放在该文件夹(本人将其命名为xpath-helper)内。
第二步:
将.crx文件重命名,改为.rar或.zip文件,解压在xpath-helper文件夹中,解压后会得到许多文件如下图
第三步:
打开Chrome浏览器,进入扩展程序页面,选择右上角的开发者模式
,之后点击左上角的加载已解压的扩展程序
,选择xpath-helper
文件夹,这样在浏览器中就会出现XPath-Helper
了。
2、安装lxml的库
想要使用xpath,我们还必须安装一个名为lxml的库,这个库安装的目录必须在python的解释器路径下。
首先,我们查看python解释器的路径。打开pycharm --> file -->settings -->Project
点击加号直接搜索安装或者命令行安装:
pip install lxml
二、xpath基本语法
1、基础语法
1. 路径查询
//:查找所有子孙节点,不考虑层级关系
/ :找直接子节点
2. 谓词查询
//div[@id]
//div[@id="maincontent"]
3. 属性查询
//@class
4. 模糊查询
//div[contains(@id, "he")]
//div[starts‐with(@id, "he")]
5. 内容查询
//div/h1/text()
6. 逻辑运算
//div[@id="head" and @class="s_down"]
//title | //price
新建一个HTML
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>Title</title>
</head>
<body><ul><li id="l1" class="c1">北京</li><li id="l2">上海</li><li id="c3">深圳</li><li id="c4">武汉</li></ul></body>
</html>
编写python文件
from lxml import etree# lxml解析本地文件 etree.parse('XX.html')
# lxml解析服务器响应文件 etree.HTML(response.read().decode('utf‐8')
tree = etree.parse('1.html')# tree.xpath(xpath路径)# 查找ul下面的li
li_list = tree.xpath('//body/ul/li')# 查找所有有id属性的li标签
# text() 获取标签中的内容
li_list = tree.xpath('//ul/li[@id]/text()')# 找到id为l1的li标签 注意引号的问题
li_list = tree.xpath('//ul/li[@id="l1"]/text()')# 查找到id位l1的li标签的class的属性值
li = tree.xpath('//ul/li[@id="l1"]/@class')# 查询id中包含l的li标签
li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')# 查询id的值以c开头的li标签
li_list = tree.xpath('//ul/li[starts-with(@id,"c")]/text()')# 查询id为l1和class为c1的li标签
li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')#查询id为l1或id为l2的li标签
li_list = tree.xpath('//ul/li[@id="l1"]/text() | //ul/li[@id="l2"]/text()')# 判断列表的长度
print(li_list)
print(len(li_list))
2、案例:爬取站长素材网上的前十页照片
# (1) 请求对象的定制
# (2)获取网页的源码
# (3)下载# 需求 下载的前十页的图片
# https://sc.chinaz.com/tupian/qinglvtupian.html 1
# https://sc.chinaz.com/tupian/qinglvtupian_page.htmlimport urllib.request
from lxml import etreedef create_request(page):if(page == 1):url = 'https://sc.chinaz.com/tupian/qinglvtupian.html'else:url = 'https://sc.chinaz.com/tupian/qinglvtupian_' + str(page) + '.html'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',}request = urllib.request.Request(url = url, headers = headers)return requestdef get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return contentdef down_load(content):
# 下载图片# urllib.request.urlretrieve('图片地址','文件的名字')tree = etree.HTML(content)name_list = tree.xpath('//div[@class="item"]//img/@alt')# 一般设计图片的网站都会进行懒加载src_list = tree.xpath('//div[@class="item"]//img/@data-original')print(src_list)for i in range(len(name_list)):name = name_list[i]src = src_list[i]url = 'https:' + srcurllib.request.urlretrieve(url=url,filename='./loveImg/' + name + '.jpg')if __name__ == '__main__':start_page = 1end_page = 10for page in range(start_page,end_page+1):# (1) 请求对象的定制request = create_request(page)# (2)获取网页的源码content = get_content(request)print(content)with open('爬虫_解析_站长素材.html','w',encoding='utf-8')as fp:fp.write(content)# (3)下载down_load(content)