xpath解析是我们在爬虫中最常用也是最通用的一种数据解析方式。

环境安装

pip install lxml

解析原理

  • 使用通用爬虫爬取网页数据
  • 实例化etree对象,且将页面数据加载到该对象中
  • 使用xpath函数结合xpath表达式进行标签定位和指定数据提取

实例化etree对象

- 1.将本地的html文档中的源码数据加载到etree对象中:
etree.parse(filePath)
- 2.可以将从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')

xpath表达式

   - xpath表达式:
- xpath('xpath表达式')
- /:表示的是从根节点开始定位。表示的是一个层级。
- //:表示的是多个层级。可以表示从任意位置开始定位。
- 属性定位://div[@class='song'] tag[@attrName="attrValue"]
- 索引定位://div[@class="song"]/p[3] 索引是从1开始的。
- 取文本:
- /text() 获取的是标签中直系的文本内容
- //text() 标签中非直系的文本内容(所有的文本内容)
- 取属性:
/@attrName ==>img/src

xpath使用案例

属性定位:
#找到class属性值为song的div标签
//div[@class="song"]
层级&索引定位:
#找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
//div[@class="tang"]/ul/li[2]/a
逻辑运算:
#找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class="du"]
模糊匹配:
//div[contains(@class, "ng")]
//div[starts-with(@class, "ta")]
取文本:
# /表示获取某个标签下的文本内容
# //表示获取某个标签下的文本内容和所有子标签下的文本内容
//div[@class="song"]/p[1]/text()
//div[@class="tang"]//text()
取属性:
//div[@class="tang"]//li[2]/a/@href

爬虫分析案例

解析58二手房的相关数据

import requests
from lxml import etree
# 需求:爬取58二手房中的房源信息 if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
# 爬取到页面源码数据
url = 'https://bj.58.com/ershoufang/'
page_text = requests.get(url=url, headers=headers).text # 数据解析
tree = etree.HTML(page_text)
# 存储的就是li标签对象
li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')
fp = open('58.txt', 'w', encoding='utf-8')
for li in li_list:
# 局部解析
title = li.xpath('./div[2]/h2/a/text()')[0] # ./表示当前解析的li标签为源码参照物
print(title)
fp.write(title + '\n')

解析下载图片数据:

# 需求:解析下载图片数据 http://pic.netbian.com/4kbeijing/
import requests
from lxml import etree
import os
if __name__ == "__main__":
url = 'http://pic.netbian.com/4kbeijing/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
# 手动设定响应数据的编码格式
# response.encoding = 'utf-8'
page_text = response.text # 数据解析:src的属性值 alt属性
tree = etree.HTML(page_text)
li_list = tree.xpath('//div[@class="slist"]/ul/li') # 创建一个文件夹
if not os.path.exists('./picLibs'):
os.mkdir('./picLibs') for li in li_list:
img_src = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
img_name = li.xpath('./a/img/@alt')[0] + '.jpg'
# 通用处理中文乱码的解决方案
# encode('iso-8859-1')
# 是将gbk编码编码成unicode编码
# decode(‘gbk’) 是从unicode编码解码成gbk字符串
img_name = img_name.encode('iso-8859-1').decode('gbk') # print(img_name,img_src)
# 请求图片进行持久化存储
img_data = requests.get(url=img_src, headers=headers).content
img_path = 'picLibs/' + img_name
with open(img_path, 'wb') as fp:
fp.write(img_data)
print(img_name, '下载成功!!!')

解析出所有城市名称

# 项目需求:解析出所有城市名称https://www.aqistudy.cn/historydata/
import requests
from lxml import etree
if __name__ == "__main__":
# headers = {
# 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
# }
# url = 'https://www.aqistudy.cn/historydata/'
# page_text = requests.get(url=url,headers=headers).text
#
# tree = etree.HTML(page_text)
# host_li_list = tree.xpath('//div[@class="bottom"]/ul/li')
# all_city_names = []
# #解析到了热门城市的城市名称
# for li in host_li_list:
# hot_city_name = li.xpath('./a/text()')[0]
# all_city_names.append(hot_city_name)
#
# #解析的是全部城市的名称
# city_names_list = tree.xpath('//div[@class="bottom"]/ul/div[2]/li')
# for li in city_names_list:
# city_name = li.xpath('./a/text()')[0]
# all_city_names.append(city_name)
#
# print(all_city_names,len(all_city_names))
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
url = 'https://www.aqistudy.cn/historydata/'
page_text = requests.get(url=url, headers=headers).text tree = etree.HTML(page_text)
# 解析到热门城市和所有城市对应的a标签
# //div[@class="bottom"]/ul/li/ 热门城市a标签的层级关系
# //div[@class="bottom"]/ul/div[2]/li/a 全部城市a标签的层级关系
a_list = tree.xpath(
'//div[@class="bottom"]/ul/li/a | //div[@class="bottom"]/ul/div[2]/li/a')
all_city_names = []
for a in a_list:
city_name = a.xpath('./text()')[0]
all_city_names.append(city_name)
print(all_city_names, len(all_city_names))

爬取站长素材中免费简历模板

# 项目需求:爬取站长素材中免费简历模板 http://sc.chinaz.com/jianli/free.html

import requests
import os
from lxml import etree if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
url = 'http://sc.chinaz.com/jianli/free.html' # 创建一个文件夹jianlitemplates
if not os.path.exists('./jianlitemplates'):
os.mkdir('./jianlitemplates')
for page in range(1, 4): # 分页提取(2-3页)
if page > 1:
url = 'http://sc.chinaz.com/jianli/free_%s.html' % page
# print(url)
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
jianli_href_list = tree.xpath(
'//div[@class="box col3 ws_block"]/a/@href') # 模板链接
jianli_name_list = tree.xpath(
'//div[@class="box col3 ws_block"]/a/img/@alt') # 模板标题
title_list = [t.encode('iso-8859-1').decode('utf-8')
for t in jianli_name_list] # 转中文 for ind, h in enumerate(jianli_href_list): # 抓取简历模板页
con_text = requests.get(url=h, headers=headers).text
con_tree = etree.HTML(con_text)
con_href = con_tree.xpath(
'//div[@class="clearfix mt20 downlist"]/ul/li/a/@href')[0] # 得到下载链接
print(con_href, title_list[ind])
wrd_path = 'jianlitemplates/' + title_list[ind] + '.rar'
# 请求模板进行持久化存储
wrd_data = requests.get(url=con_href, headers=headers).content
with open(wrd_path, 'wb') as fp: # 保存简历模板
fp.write(wrd_data)
print(title_list[ind], '下载成功!!!')

xpath库学习的更多相关文章

  1. python爬虫解析库学习

    一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...

  2. 【转】XPath的学习

    xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker   定位 1.依靠自己属性,文本定位 //td[ ...

  3. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

  4. dlib库学习之一

    dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...

  5. python_库学习_01

    一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...

  6. numpy, matplotlib库学习笔记

    Numpy库学习笔记: 1.array()   创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...

  7. 【mmall】Guava库学习Collections

    参考链接 Guava库学习:学习Collections(三)Sets

  8. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  9. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

随机推荐

  1. SQL Server 存储过程 数组参数 (How to pass an array into a SQL Server stored procedure)

    Resource from StackOverflow 使用存储过程,如何传递数组参数? 1.分割解析字符串,太麻烦 2.添加Sql Server 自定义类型 sp_addtype 问题需求:需要向S ...

  2. php7新增的两个操作符---null合并及飞船操作符

    <?php //null合并操作符?? //(太空)飞船操作符<=> //The operator returns 0 if both operands are equal, 1 i ...

  3. 【比赛游记】NOI2019打铁记

    上接 NOIWC2019冬眠记.(THUPC,CTS,APIO)2019四连爆蛋记 和 THUSC2019酱油记. Day0.5 笔试 AK 是容易的. 国家队选手见面会太好玩了啊! Day1 Day ...

  4. P5021 赛道修建[贪心+二分]

    题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,-,n1,2,-,n,有 n-1n−1 条适合于修建赛道的双向通 ...

  5. 项目Beta冲刺(团队3/7)

    项目Beta冲刺(团队) --3/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...

  6. 调皮的js

    一.中文变量名 今天偶然看文章.看到js的var还可以用中文做变量名,那么我们试试,看看中文的变量名是否能打印出值呢? var 临时变量="111"; console.log(临时 ...

  7. 转换复杂的JSON对象为 Map对象

    最近项目需要跟客户对接一个webservice接口,客户那传json串过来,属于比较复杂的json串,这里跟大家分享下我项目中所用的解析方法: 该方法需要以下jar package com.test; ...

  8. 23、matplotlib数据可视化、绘图库模块

    matplotlib官方文档:https://matplotlib.org/contents.html?v=20190307135750 matplotlib是一个绘图库,它可以创建常用的统计图,包括 ...

  9. the_permalink()和get_permalink()的区别

    wordpress中the_permalink()是用于posts loop循环中(判断是否有文章,如果有文章则展示出来:如果没有文章就显示没有文章),常用于文章分类列表和文章页的模板中,用法如下 & ...

  10. iOS 图像渲染原理

    http://chuquan.me/2018/09/25/ios-graphics-render-principle/ 通过 图形渲染原理 一文,大致能够了解图形渲染过程中硬件相关的原理.本文将进一步 ...