上接:第三章:数据解析(bs4法)
下接:第四章:验证码识别

1.xpath解析简介

最常用且最便捷高效的一种解析方式。通用性很好
xpath解析原理

  • 实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
  • 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

环境的安装

  • pip insatll lxml

如何实例化一个etree对象

  • ①.将本地的html文档中的源码数据加载到etree对象中:
etree.parse(filePath)
  • ②可以从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')
  • xpath(‘xpath表达式’):根据不同形式的xpath表达式去定位到不同的标签并且将定位到不同位置的标签数据进行捕获。

2.不同的xpath表达式

本地用于测试的test.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>此页面以作为测试</title></head>
<body><div><p>百里守约</p></div><div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="http://www/song.com/" title="赵匡胤" target="_self"><span>this is span</span>宋朝时最强大内王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a href="" class="du">总为浮云能避日,长安不见使人愁</a><img src="http://www.baidu.com/moinv.jpg" alt="" /></div><div class="tang"><ul><li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a href="http://www.126.com" title="qi">岐王宅里寻常见,崔久堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a href="http://www.sina.com" title="du">杜甫</a></li><li><a href="http://www.dudu.com" title="du">杜牧</a></li><li><b>hello world</b></li><li><i>happy</i></li><li><a herf="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋秦径,晋代衣冠成古丘</a></li></ul></div>
</body>
</html>

2.1 /表示的是从根节点开始定位,表示的是一个层级。

 r=tree.xpath('/html/head/title')r = tree.xpath('/html//title')

2.2 //表示的是多个层级,可以表示从任意位置开始定位

 r = tree.xpath('//title')

2.3 属性定位

tag[@attrName="attrValue"]

 r=tree.xpath('//div[@class="song"]')

2.4 索引定位

 r=tree.xpath('//div[@class="song"]/p[3]')

2.5 获取标签中的文本内容

如果是直系文本内容,就在path末尾加/text(),但如果文本内容不是该标签下的直系文本,就使用//text()

 r=tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]

2.6 获取属性标签中的链接/@src

 r=tree.xpath('//div[@class="song"]/img/@src')

代码验证:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
import requestsif __name__ == "__main__":#实例化一个etree对象,且将被解析的源码加载了对象中tree=etree.parse('test.html')#分级查询r=tree.xpath('/html/body/div')print(r)print('-------分界线-------')r = tree.xpath('/html//div')print(r)print('-------分界线-------')r = tree.xpath('//div')print(r)print('-------分界线-------')r=tree.xpath('//div[@class="song"]')print(r)print('-------分界线-------')r=tree.xpath('//div[@class="song"]/p[3]')print(r)print('-------分界线-------')r=tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]print(r)print('-------分界线-------')r=tree.xpath('//div[@class="song"]/img/@src')print(r)pass

输出结果:

[<Element div at 0x23254d95340>, <Element div at 0x23255915e40>, <Element div at 0x23255938f00>]
-------分界线-------
[<Element div at 0x23254d95340>, <Element div at 0x23255915e40>, <Element div at 0x23255938f00>]
-------分界线-------
[<Element div at 0x23254d95340>, <Element div at 0x23255915e40>, <Element div at 0x23255938f00>]
-------分界线-------
[<Element div at 0x23255915e40>]
-------分界线-------
[<Element p at 0x23255939e80>]
-------分界线-------
杜牧
-------分界线-------
['http://www.baidu.com/moinv.jpg']进程已结束,退出代码0

3.代码实践

3.1爬取58二手房中的房源信息

分析层级关系

找到房源信息题目文本所在的标签

xpath的获取可以在抓包工具中右键——复制——对应的xpath

代码实现:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
import requestsif __name__ == "__main__":# UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'}url='https://ls.58.com/ershoufang/?PGTID=0d000000-0000-0595-081a-b95e593d6437'#爬取到页面源码数据page_text =requests.get(url=url,headers=headers).text#实例化一个etree对象,进行数据解析#由于是网页获取,所以函数使用HTMLtree=etree.HTML(page_text)#存储的就是a标签对象div_list=tree.xpath('//*[@id="__layout"]/div/section/section[3]/section[1]/section[2]/div')fp=open('58.txt','w',encoding='utf-8')#将a标签中对应的题目信息所存的位置找出for div in div_list:title=div.xpath('./a/div[2]/div[1]/div[1]/h3/text()')[0]print(title)fp.write(title+'\n')passprint("爬取信息成功")

输出:
这里要注意,58同城的界面如果隔一段时间没有操作会自动停止访问,之后运行代码访问url的话爬取不到任何信息也不会报错,这时就需要我们对该页面进行刷新填写验证码。

3.2 4k高清图片下载

选用网址:http://pic.netbian.com/4kdongman/

代码部分:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
import requests
import os
if __name__ == "__main__":# UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'}url='http://pic.netbian.com/4kdongman/'page_text = requests.get(url=url,headers=headers).text#创建一个etree对象tree=etree.HTML(page_text)#数据解析:src的属性值,alt属性可作为图片名称li_list=tree.xpath('//div[@class="slist"]/ul/li')# 创建一个文件夹,保存所有的图片if not os.path.exists('./xpath_images'):os.mkdir('./xpath_images')passfor 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'#通用处理中文乱码的解决方案img_name=img_name.encode('iso-8859-1').decode('gbk')# 通用图片进行持久化存储img_data=requests.get(url=img_src,headers=headers).contentimg_path='xpath_images/'+img_namewith open(img_path,'wb') as fp:fp.write(img_data)print(img_name+"下载成功!!")

运行结果:

3.3 全国城市名称爬取

选用网址:
https://www.aqistudy.cn/historydata/

代码
①热门城市与全部城市分开计数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
import requests
import os
if __name__ == "__main__":# UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'}url='https://www.aqistudy.cn/historydata/'page_text = requests.get(url=url,headers=headers).text#创建一个etree对象tree=etree.HTML(page_text)#数据解析li_list=tree.xpath('//div[@class="bottom"]/ul/li')cities_name = []for li in li_list:hot_city_name=li.xpath('./a/text()')[0]cities_name.append(hot_city_name)city_name_list = tree.xpath('//div[@class="bottom"]/ul/div[2]/li')for li in city_name_list:city_name=li.xpath('./a/text()')[0]cities_name.append(city_name)print(cities_name)print("城市总个数为:%d"%(len(cities_name)))

输出结果:

②热门城市与全部城市共用一个xpath表达式
代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lxml import etree
import requests
import os
if __name__ == "__main__":# UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'}url='https://www.aqistudy.cn/historydata/'page_text = requests.get(url=url,headers=headers).text#创建一个etree对象tree=etree.HTML(page_text)#数据解析#热门城市对应的层级关系:div/ul/li/a#全部城市对应的层级关系:div/ul/div[2]/li/ali_list=tree.xpath('//div[@class="bottom"]/ul/li/a | //div[@class="bottom"]/ul/div[2]/li/a')cities_name = []for li in li_list:city_name=li.xpath('./text()')[0]cities_name.append(city_name)print(cities_name)print("城市总个数为:%d"%(len(cities_name)))


去重的话调用python对列表元素重复的函数处理:
cities_name=list(set(cities_name))

python爬虫实战之旅( 第三章:数据解析(xpath法))相关推荐

  1. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  2. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  3. python爬虫实战之旅( 第三章:数据解析(bs4法))

    上接:第三章:数据解析(正则法) 下接:第三章:数据解析(xpath法) 1.数据解析步骤 标签定位 提取标签,标签属性中存储的数据值 2.bs4数据解析的原理 实例化一个BeautifulSoup对 ...

  4. Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  5. python爬虫系列——开始入土(二)数据解析

    数据解析 数据解析分类 正则 例子:使用正则聚焦爬取图片 bs4 bs4提供的用于数据解析的属性和方法 实战练习:爬取三国演义所有章节标题和内容 xpath xpath解析原理 环境的安装 如何实例化 ...

  6. 路飞学城-Python爬虫实战密训-第1章

    正式的开始学习爬虫知识,Python是一门接触就会爱上的语言.路飞的课真的很棒,课程讲解不是告诉你结论,而是在告诉你思考的方法和过程. 第一章,学习了如何爬取汽车之家以及抽屉登录并点赞. 1 impo ...

  7. 路飞学城-Python 爬虫实战密训-第 1 章

    本节学习体会: 鸡汤心得: 1.时代发展太快,要不断学习新东西,武装自己,才能跟得上时代的潮流,不然就是面临被pass的命运 2.要看清楚趋势,不要闭门造车 3.学习编程语言就跟学英语一样,方法很重要 ...

  8. 路飞学成-Python爬虫实战密训-第3章

    1,本节学习体会.心得 : 本章的内容非常多,scrapy框架的使用.对于学过django的人来说.可能要更好理解一些把.个人感觉还是挺简单的.所有的知识点一听就懂,唯一不好的就是时间太紧迫了,不的不 ...

  9. Python 爬虫实战 汽车某家(三) 车型

    文章目录 一.爬取逻辑分析 核心 二.爬取页面销售状态分析 三.爬取页面车型列表分析 四.停售分页分析 五.指导价和评分爬取 1.指导价html片段 2.有评分html片段 3.无评分html片段 一 ...

最新文章

  1. 技术总监的反思录:我是如何失去团队掌控的?
  2. R语言使用DALEX包的model_profile函数对caret包生成的多个算法模型的离散变量进行分析、使用偏依赖图(Partial Dependence Plots)解释某个离散特征和目标y的关系
  3. 小白也能看懂的git入门实操[狂神聊git学习笔记]
  4. idea 不能及时编译_您是否能及时编译?
  5. How to debug WCF in local
  6. Java 面向对象 知识点基础浅谈
  7. 阶段3 2.Spring_01.Spring框架简介_03.spring概述
  8. b站黑马程序员java视频学习笔记01
  9. 遗传算法python实现
  10. [软件更新]影拓三代 PTZ系列 系列 驱动程序 V6.1.1-3{链接已修复}
  11. async function
  12. Blender - Proportional Edit Mode - 按比例编辑模式(3D版的液化、挤压工具)
  13. 【数据分析/挖掘】如何处理类别型特征?常用编码方式?Python实现?
  14. 我的世界服务器登录显示motd,[信息]ColorMOTD —— 究极Motd插件,外带反压测[1.7-1.8]...
  15. 开发人员该选择什么大数据工具提高工作效率?
  16. 时光穿梭机特效如何制作?建议试试这个时光机穿梭工具
  17. st_contains
  18. TX2安装opencv3.4.0
  19. 鼠标移到到图片,图片向上滑动预览效果
  20. 【跟Leon一起刷LeetCode】412. Fizz Buzz

热门文章

  1. oracle各版本的区别,Oracle版本的区别有那些
  2. CSS 精灵(雪碧图、精灵图)、滑动门
  3. easyui form 返回html,form(表单) - TopJUI前端框架,不用写JS代码的EasyUI
  4. 坑!计蒜客——乳草的侵占
  5. [Mattermost]安装Docker版
  6. B站的弹幕为什么可以不挡住人物
  7. 【期权】期权投资策略与盈亏计算
  8. avg是java关键字_浅谈AVG游戏中的脚本
  9. 基于51单片机声音噪声分贝检测采集显示proteus仿真原理图PCB程序设计
  10. 13 微积分——级数