Python爬虫之xpath数据解析
程序员文章站
2024-01-27 14:14:10
...
利用xpath进行数据解析,爬取ppt模板
一、准备工作和xpath简单介绍
1、安装和导入相应的包和模块
需要用到的包(模块):requests,lxml,os;
requests用来发起请求,lxml用于解析,os用于创建一个文件夹来保存爬取到的模板
2、xpath简介
(1)xpath解析的原理:
<1> 实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
<2> 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
(2)环境的安装:
pip install lxml
(3)实例化etree对象:
<1>.将本地的html文档中的源码数据加载到etree对象中: etree.parse(filePath)
<2>.可以将从互联网上获取的源码数据加载到该对象中 :etree.HTML(‘page_text’)
(4)xpath表达式:
- 单斜杠 /:表示的是从根节点开始定位。表示的是一个层级
- 双斜杠//:表示的是多个层级。可以表示从任意位置开始定位
- 属性定位://div[@class=‘song’] ==>tag[@attrName=“attrValue”]
- 索引定位://div[@class=“song”]/p[3] ,注意索引是从1开始的。
- 取文本:
/text() 获取的是标签中直系的文本内容
//text() 标签中非直系的文本内容(所有的文本内容)
-取属性:/@attrName ==>img/src(取img标签中src属性)
二、需求分析和编写程序
首页的url是:“http://www.ypppt.com/moban/lunwen/”,分析发现要下载一个ppt模板首先要在首页点进去该模板的详情页面,再点击“点击下载”跳转到下载页面,在下载页面选择下载地址。因此,可以分为3部分进行分析。
1、对首页的分析:得到详情页的url
详情页面的URL的一部分就是a标签的href属性,而a标签所在位置是在(ul[@class=“posts clear”]/li/a[1]), 这样就很容易取得a标签的href属性了,再进行拼接就可以得到详情页的url了。
url = 'http://www.ypppt.com/moban/lunwen/'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
#首页的数据
page_text = requests.get(url=url, headers=headers).text
#创建一个首页的etree对象,对首页进行数据解析
tree = etree.HTML(page_text)
#首页的a标签的href属性
start_page_a_href_list = tree.xpath('//ul[@class="posts clear"]/li/a[1]/@href')
2、对详情页面的分析:得到下载页面的url
不难发现下载页面的url一部分在a标签的href属性中,a标签在(div[@class=“button”]/a),把得到的下载页面的url存放在一个列表中。
download_url_list = []
for start_page_a_href in start_page_a_href_list:
detail_url = 'http://www.ypppt.com/'+start_page_a_href
#详情页的数据
detail_page_text =requests.get(url=detail_url,headers=headers).text
#对详情页的数据进行解析、
detail_tree = etree.HTML(detail_page_text)
#详情页a标签的href属性
detail_a_href = detail_tree.xpath('//div[@class="button"]/a/@href')[0]
download_url_list.append('http://www.ypppt.com'+detail_a_href)
3、对下载页面的分析:得到下载地址并爬取ppt模板
这是PPT模板的下载地址和名字,可是名字是“xxxxxxxx-下载页”,所以要进行字符串的切割。
for download_url in download_url_list:
#下载页面的数据
download_page_text = requests.get(url=download_url,headers=headers).text
#解析下载页面的数据
download_tree = etree.HTML(download_page_text)
#下载地址
download_a_href = download_tree.xpath('//ul[@class="down clear"]/li/a/@href')[0]
#ppt的二进制数据
ppt_data = requests.get(url=download_a_href, headers=headers).content
#ppt名字
ppt_name = download_tree.xpath('//div[@class="de"]/h1/text()')[0]
#字符串的分割
ppt_name1 = ppt_name.split('-')[0]+'.zip'
#路径
ppt_path = 'ppt/' + ppt_name1
with open(ppt_path, 'wb') as fp:
fp.write(ppt_data)
print(ppt_name1, '下载成功!!!')
三、执行结果
这里是爬取5页PPT模板
完整程序的代码:https://download.csdn.net/download/qq_45694646/12613783