python项目(2)---xpath库的应用
#作者:shelbi
程序部分
import requests
from lxml import etreeBASE_DOMAIN = 'https://www.dytt8.net'
HEADERS={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
} #全局变量一般使用的是大写def get_details_urls(url):response = requests.get(url , headers = HEADERS)text = response.content.decode('gbk')html = etree.HTML(text) # 解析成element对象detail_urls = html.xpath('//table[@class="tbspan"]//a/@href') # //a用两个斜杠的原因是因为a标签是table标签的子孙标签 所有要用两个斜杠detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls)return detail_urls
def parse_detail_page(url): #解析详情页面movie = {}response =requests.get(url , headers = HEADERS)text = response.content.decode('gbk')html = etree.HTML(text)title = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")[0]movie['title'] = titleZoomE = html.xpath("//div[@id='Zoom']")[0]imgs = ZoomE.xpath(".//img/@src")cover = imgs[0]movie['cover']=coverinfos = ZoomE.xpath(".//text()")def parse_info(info,rule): return info.replace(rule,"").strip() for index, info in enumerate(infos): # print(index) # print(info)# print('='*30)if info.startswith("◎年 代"):info=parse_info(info,"◎年 代")movie['year']=infoelif info.startswith("◎产 地"):info=parse_info(info,"◎产 地")movie['country']=infoelif info.startswith("◎类 别"):info=parse_info(info,"◎类 别")movie['catagory']=infoelif info.startswith("◎豆瓣评分"):info=parse_info(info,"◎豆瓣评分")movie['douban_rating']=infoelif info.startswith("◎片 长"):info=parse_info(info,"◎片 长")movie['duration']=infoelif info.startswith("◎导 演"):info=parse_info(info,"◎导 演")movie['director']=infoelif info.startswith("◎主 演"):info=parse_info(info,"◎主 演")actors=[info]for x in range(index+1,len(infos)): actor = infos[x].strip()if actor.startswith('◎'):breakactors.append(actor)movie['acotors']=actorselif info.startswith("◎简 介"):info = parse_info(info,"◎简 介")for x in range(index+1,len(infos)):profile=infos[x].strip()movie['profile']=profiledownload_url = ZoomE.xpath(".//a/@href")[0]movie['download_url']= download_urlreturn moviedef spider():movies =[]base_url ='https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'for x in range(1,8): #x取值从1到7#第一页for循环,是用来控制总共有七页url = base_url.format(x) #format函数用法之一 将x的值填入base_url的列表detail_urls =get_details_urls(url)for detail_url in detail_urls:#第二个for循环,是用来遍历一页中所有电影的详情urlmovie = parse_detail_page(detail_url)movies.append(movie)print(movie)if __name__ =='__main__':spider()
程序分析:
(1)先运行spider()函数:
def spider():
movies =[]
base_url ='https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
for x in range(1,8): #x取值从1到7
#第一页for循环,是用来控制总共有七页
url = base_url.format(x) #format函数用法之一 将x的值填入base_url里头的字典
detail_urls =get_details_urls(url)
for detail_url in detail_urls:
#第二个for循环,是用来遍历一页中所有电影的详情url
movie = parse_detail_page(detail_url)
movies.append(movie)
print(movie)
!注意内容:
经由分析网页的电影天堂中的第一页第二页第三页分析出,base_url只是list_23_{}在变化,例如list_23_1就是第一页的url以此类推
所以使用for in遍历,在利用format函数,range取值方法,填入base_url,获取一共七页的url
(2).接下来将这个一共七页的url传入函数: get_details_urls(url):
def get_details_urls(url):
response = requests.get(url , headers = HEADERS)
text = response.content.decode('gbk')
html = etree.HTML(text) # 解析成element对象
detail_urls = html.xpath('//table[@class="tbspan"]//a/@href') # //a用两个斜杠的原因是因为a标签是table标签的子孙标签 所有要用两个斜杠
detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls)
return detail_urls
将七页电影天堂的url传入这个函数,作用就是将每一页的当中的电影详情页的url抓取出来,并且将最后函数运行最后结果返回给detail_urls 并且赋值到spider()函数中的detail_urls,将这些电影详情页的url在进行for in遍历赋值给detail_url作为参数传给
parse_detail_page(detail_url)
!注意两个内容:①:上述text使用decode('gbk')解码,为什么?
分析网页程序中发现charset=gb2312 charset:字符集 即编码方式是以gbk方式编码的 所以解码方式理所应当用gbk的方式
②: detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls) map函数是什么东西?
这块函数等同于:
def abc(url):
return BASE_DOMAIN+url
index=0
for detail_url in detail_urls:
detail_url = abc(detail_url)
detail_urls[index]=detail_url
index+=1
简单来说这块函数相当于使用for in循环 detail_urls与BASE_DOMAIN相加
(3)
def parse_detail_page(url):
movie = {}
response =requests.get(url , headers = HEADERS)
text = response.content.decode('gbk')
html = etree.HTML(text)
title = html.xpath("//div[@class='title_all']//font[@color='#07519a']/text()")[0]
movie['title'] = title
ZoomE = html.xpath("//div[@id='Zoom']")[0]
imgs = ZoomE.xpath(".//img/@src")
cover = imgs[0]
movie['cover']=cover
infos = ZoomE.xpath(".//text()")
def parse_info(info,rule):
return info.replace(rule,"").strip()
for index, info in enumerate(infos):
if info.startswith("◎年 代"):
info=parse_info(info,"◎年 代")
movie['year']=info
elif info.startswith("◎产 地"):
info=parse_info(info,"◎产 地")
movie['country']=info
elif info.startswith("◎类 别"):
info=parse_info(info,"◎类 别")
movie['catagory']=info
elif info.startswith("◎豆瓣评分"):
info=parse_info(info,"◎豆瓣评分")
movie['douban_rating']=info
elif info.startswith("◎片 长"):
info=parse_info(info,"◎片 长")
movie['duration']=info
elif info.startswith("◎导 演"):
info=parse_info(info,"◎导 演")
movie['director']=info
elif info.startswith("◎主 演"):
info=parse_info(info,"◎主 演")
actors=[info]
for x in range(index+1,len(infos)):
actor = infos[x].strip()
if actor.startswith('◎'):
break
actors.append(actor)
movie['acotors']=actors
elif info.startswith("◎简 介"):
info = parse_info(info,"◎简 介")
for x in range(index+1,len(infos)):
profile=infos[x].strip()
movie['profile']=profile
download_url = ZoomE.xpath(".//a/@href")[0]
movie['download_url']= download_url
return movie
!注意五块内容:①:ennumerate()函数用法
e = '人生苦短,我用python'
for index,e in enumerate(e):
print(index)
print(e)
print('='*30)
控制台结果:
0
人
==============================
1
生
==============================
2
苦
==============================
3
短
==============================
4
,
==============================
5
我
==============================
6
用
==============================
7
p
==============================
8
y
==============================
9
t
==============================
10
h
==============================
11
o
==============================
12
n
==============================
enumerate函数用法:将得到的数据分成下标以及数据内容,可以分别打印出来
②:
ZoomE = html.xpath("//div[@id='Zoom']")[0]
imgs = ZoomE.xpath(".//img/@src")
cover = imgs[0]
movie['cover']=cover
上述程序说明:
直接打印imgs出现的两张图片,需求是要海报,所以取第一个元素
movie['cover']=cover相当于
movie = {
'cover':'cover'}
由于parse_detail_page(url)函数里头定义了一个空字典movie = {},可以理解一个字典由许多列表组成,movie['cover']=cover
相当于把这个列表结果放入字典
imgs = ZoomE.xpath(".//img/@src"): .号意味着从ZoomE为根节点开始找数据,/一个斜杠代表找子元素,//代表找子孙元素或者也可以说是找ZoomE底下的任意元素,>子孙也是可以找到的
③:
startswith()函数,传入要提取数据的开头,可以提取需要的数据且该数据独占一行。
直接提取数据的时候会出现开头的东西,例如程序 if info.startswith("◎年 代"):直接打印出来会出现◎年 代
因此使用replace方法,用空字符替代掉◎年 代,之后打印出来的结果出现空格,用.strip去掉,上述程序定义了一个函数
如下:
def parse_info(info,rule):
return info.replace(rule,"").strip() 因此只要调用这个函数就能满足要求
④:
infos = ZoomE.xpath(".//text()") text() xpath提取数据要提取标签中的文本的时候可以直接使用这个
不一定使用etree.tostring() 这个函数方法可以讲element对象变成字符串,但是list对象会报错,使用这个
要先去掉list
⑤:
[0]可以去掉list提取列表当中的第一个元素
python项目(2)---xpath库的应用相关推荐
- python xpath语法-Python爬虫之XPath语法和lxml库的用法
本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法 安装 为什么要用这个库 ...
- 可爱的python测试开发库及项目(python测试开发工具库汇总)
转载: https://www.jianshu.com/p/ea6f7fb69501 可爱的python测试开发库及项目(python测试开发工具库汇总) github地址 相关书籍下载 Python ...
- 数学题库python_GitHub Python项目推荐|一个拍照做题程序|数学计算题识题|opencv...
GitHub Python项目推荐|一个拍照做题程序输入一张包含数学计算题的图片输出识别出的数学计算式以及计算结果 项目分析 仓库名称:mathAI 标星(star):1469 (网红级项目,高手作品 ...
- python爬虫——使用requests库和xpath爬取猎聘网职位详情
文章目录 前言 一.页面分析 1.职位列表页面分析 2.职位详情页面URL获取 3.职位详情页面分析 至此,所有页面解析完毕,开始写代码. 二.代码编写 1.导入相应库 2.设置代理和随机请求头 3. ...
- 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次
基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 文章目录 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 一.前言 ...
- python快速安装大量库,想要运行别人的大型项目代码?直接让他把库打包发过来
如题:最近对接师兄的项目,由于配置不同,环境不同python版本不同,库版本不同,我始终运行不起来代码,安装库还一堆兼容问题 后面发现直接复制到虚拟环境下,就可以显示读取到库了,那岂不是美滋滋. 注意 ...
- Python 项目依赖包 第三方库 生成requirements.txt的两种方法
python项目如何在另一个环境上重新构建项目所需要的运行环境依赖包? 使用的时候边记载是个很麻烦的事情,总会出现遗漏的包的问题,这个时候手动安装也很麻烦,不能确定代码报错的需要安装的包是什么版本.这 ...
- python实战项目书 题库系统_Python实战视频教程_基于Python项目与面试题实例讲解(进阶训练篇)...
课程介绍: 精选50个Python项目实战与面试容易遇到的问题作为训练任务,每个任务都先提出问题,分析问题.然后给出巧妙与高效的解决办法,最后手把手代码实战完成任务,带你全面提升python项目实战核 ...
- python中的urllib库_Python2/3中的urllib库
介绍urllib库在不同版本的Python中的变动,并以Python3.X讲解urllib库的相关用法. urllib库对照速查表 Python2.X Python3.X urllib urllib. ...
- python练手经典100例-推荐几个适合新手练手的Python项目《python入门例子》
python 为什么实例对象可以调用类方法? 实例是什么例是类定义的实.那么,类中所定义的属方只要没有被屏蔽,在它的实体中就同样是可访问的. 至于说没有run()没有参数self,而是参数cls,为什 ...
最新文章
- mac webpack 版本_晓前端周刊 第48期:EMP面向未来微前端方案正式开源了!玩转 webpack,使你的打包速度提升 90%;...
- OpenCV精进之路(二十一):实例——去除发票上的印章
- 【操作系统】处理机调度与死锁(三)
- python教程视频-有没有适合零基础小白学的python教程,视频或者书籍都可以?
- 你是否需要购买网站重构?
- Mac brew update手顺
- 加入中视频计划赚钱吗?你还别不信收益确定高
- ABP框架引入easyUI
- 解决关于java的IO流进行文件拷贝时拒绝访问的问题
- Nvidia GPU信息nvidia-smi(Persistence-M持久性内存、Volatile Uncorr. ECC显存错误校正、GPU-Util显卡利用率、Compute M.显卡计算模式)
- github使用ssh方式
- 关于JavaWeb JSP的思维导图
- 计算机网络学习笔记:基础知识
- 使用SMTP发送电子邮件
- 利用留数定理计算傅立叶变换积分
- 租房大数据-2016年如何在北京租到好房子
- python经理培训
- 山东工商学院计算机拟录取,2019年山东工商学院拟录取名单公示
- HTC Ons S3 台版 RUU
- 玩游戏的时候计算机弹出,win10电脑全屏玩游戏时自动弹出桌面的问题怎么解决...