数据解析-Xpath、BeautifulSoup4、re正则表达式

一、Xpath数据解析

  • XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。
  • 最初是用来搜寻XML文档的,但同样适用于HTML文档的搜索。所以在做爬虫时完全可以使用 XPath做相应的信息抽取

1.Xpath概览

  • XPath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过100个内建函数,用于字符串串、数值、时间的匹配以及节点、序列列的处理等,几乎所有想要定位的节点都可以用XPath 来选择。
  • 官方文档:https://www.w3.org/TR/xpath/

2.XPath常用规则

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选区直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
选取当前节点的父节点
@ 选取属性

这里列出了XPath的常用匹配规则,示例如下:

  • //title[@lang=‘eng’]

这是一个XPath规则,代表的是选择所有名称为title,同时属性lang的值为eng的节点。

3.安装Xpath

windows->python3环境下:pip install lxml
linux环境下:pip3 install lxml

  • 可以在https://www.w3school.com.cn/xpath/index.asp进行学习

二、BeautifulSoup数据解析

  • BeautifulSoup4(简称bs4)翻译成中文就是“美丽的汤”这个奇特的名字来源于《爱丽丝梦游仙境》(这也是为何在其官网会配上奇怪的插图,以及用《爱丽丝》的片段作为测试文本)。

官方文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

bs4安装

pip install Beautifulsoup4

bs4使用

安装后需要在bs4中导入使用

rom bs4 import BeautifulSoup

使用tip:在使用时需要指定一个“解析器”:
html.parse-python自带,但容错性不够高,对于一些写得不太规范的网页会丢失部分内容
lxml-解析速度快,需额外安装 (推荐使用)
xml-同属 lxml 库,支持 XML 文档
html5lib-最好的容错性,但速度稍慢

bs4的三种使用方式

# 1. 通过tag标签对象获取文档数据
# r = soup.title
# r = soup.title['abc']
# r = soup.p
# r = soup.p['class']
# r = soup.title.text
# r = soup.p.parent.name
# print(r)# 2. 通过搜索获取页面中的元素 find,find_all
# r = soup.find('a')
# r = soup.find_all('a')
# r = soup.find('title')
# # print(r,type(r))
# print(r.text)
# print(r.get_text())
# print(r)# 3.css选择器
# 通过标签 选择元素
r = soup.select('title')
# 通过class类名获取元素
r = soup.select('.title')
# 通过ID名获取元素
r = soup.select('#link2')
# 通过空格 层级关系获取元素
r = soup.select('html body p')
# 通过逗号,并列关系获取元素
r = soup.select('a,title')
# print(r)

三、正则表达式数据解析

正则表达式,就是使用字符,转义字符和特殊字符组成一个规则,
使用这个规则对文本的内容完成一个搜索或匹配或替换的功能、

正则表达式的组成

普通字符: 大小写字母,数字,符合。。。
转义字符:\w \W \d \D \s \S ...
特殊字符:.  * ? + ^ $ [] {} ()
匹配模式:I U。。。

示例:

# 使用正则表达式进行匹配的 基本语法
import re
# 定义字符串
vars = 'iloveyou521tosimida'
# 定义正则表达式
reg = 'love'
# 调用正则函数方法
res = re.findall(reg,vars)
print(res)

正则模式

# 正则模式 re.I 不区分大小写
vars = 'iLOVEyou'reg = '[a-z]{5,10}'
res = re.search(reg,vars,re.I)
print(res)

抓取方式 性能 使用难度
lxml 简单
BeautifulSoup 简单
正则表达式 困难

实操

1.爬取一个网页

这里用了学校的官网

  • F12 -Header-Request Header-Referer: https://(学校官网链接)/xyszl.htm
  • referer是header的一部分,浏览器向web服务器发送请求时一般会带上Referer,用来表示从哪链接到当前的网页,服务器因此可以获得一些信息用于处理,采用的格式是URL
import requests
res=requests.get("https://www.szpt.edu.cn/xyszl.htm")
res.encoding=res.apparent_encoding
print(res.text)
import re
re.findall('<a.*?class="afinve"><span>(.*?)</span>',res.text)

2.豆瓣电影排行榜

  • 网址:https://movie.douban.com/top250?start=0&filter=
  • 观察网址发现start=后面的数值每下一页+25
  • F12-Elements发现电影信息在<ol class="grid_view">里的<li>...</li>里有电影的排名、电影名、上映年份、国家等信息
import re
#re.findall('<a.*?class="afinve"<span>(.*?)</span>',res.text)
from bs4 import BeautifulSoup
import requests
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKib/537.36 (KHTML, like Gecko)"}
res=""
names=[]
years=[]
countrys=[]
types=[]
rates=[]
peoples=[]for i in range(10):res=requests.get("https://movie.douban.com/top250?start="+str(i*25)+"&filter",\headers=headers).textsoup=BeautifulSoup(res,"lxml")items=soup.find_all("div",class_="info")for item in items:names.append(item.span.string)#names.append(item.find("span",class_="title").string)#years.append(re.findall(".*?(\d+).*?",item.p.contents[2]))years.append(item.p.contents[2].split("\xa0")[0].strip())countrys.append(item.p.contents[2].split("\xa0")[2].strip())types.append(item.p.contents[2].split("\xa0")[4].strip())rates.append(item.find("span",class_="rating_num").string)peoples.append(item.find("div",class_="star").find_all("span")[3].string[:-3])
f=open("movies.csv","w+")
f.write("电影名称,上映年份,国家,影片类型,豆瓣评分,评价人数\n")
for i in range(len(names)):f.write("{},{},{},{},{},{}\n".format(names[i],years[i],countrys[i],types[i],rates[i],peoples[i]))
f.close()

3.网易云音乐下载

  • 这是一个可以下载专辑的爬虫
  • 播放地址http://music.163.com/playlist?id=2741819459
import requests
from bs4 import BeautifulSoup
import urllib.requestheaders = {'Referer':'http://music.163.com/','Host':'music.163.com','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}#url地址
play_url = 'http://music.163.com/playlist?id=2741819459'#用requests.get()获取页面内容
s = requests.session()
response=s.get(play_url,headers=headers).content#用beatifulSoup4匹配出对应的歌曲名称和地址
s = BeautifulSoup(response,'lxml')
main = s.find('ul',{'class':'f-hide'})lists=[]
for music in main.find_all('a'):list=[]#print('{}:{}'.format(music.text,music['href']))musicUrl='https://music.163.com/song/media/outer/url'+music['href'][5:]+'.mp3'musicName=music.text#单首歌曲的名字和地址放在list列表中list.append(musicName)list.append(musicUrl)#全部歌曲信息放在lists列表中lists.append(list)print(lists)#下载列表中全部歌曲,并以歌曲名命名下载后的文件,文件位置为当前文件夹
for i in lists:url=i[1]name=i[0]try:print('下载中',name)urllib.request.urlretrieve(url,'./%s.mp3'% name)print('下载成功')except:print('下载失败')

4.贴吧获取图片

  • 这个爬虫可以获取一个帖子内的所有图片,并下载到一个名为imgtieba的文件夹中
# _*_ coding:utf-8 _*_
# 安装两个包
# pip install beautifulsoup4
# pip install urllib3
import os
import urllib
import urllib.request
from bs4 import BeautifulSoup
import re# 获取内容
def get_content(url):html = urllib.request.urlopen(url)content = html.read().decode("utf-8", "ignore")html.close()return content# 获取帖子的页数
def get_page_num(url):content = get_content(url)# < a href = "/p/2314539885?pn=31" >尾页 < / a >pattern = r'<a href="/p/.*?pn=(.*)">尾页</a>'return int(re.findall(pattern, content)[0])# 保存图片
def get_images(info, photo_path, npage, photo_format):if not os.path.exists(photo_path):os.makedirs(photo_path)soup = BeautifulSoup(info)# 找到所有  img 标签  然后后面跟的class =  BDE_Imageall_img = soup.find_all("img", class_="BDE_Image")# 设置计数器x = 0for img in all_img:image_name = photo_path + str(npage) + "_" + str(x) + photo_formaturllib.request.urlretrieve(img["src"], image_name)x += 1print("find photo page %d NO. %d" % (npage, x))return len(all_img)# 主函数 可改动的参数
# URL——贴吧路径
# photo-path——图片保存的路径
# 图片格式——'.jpg' '.png' '.gif'
if __name__ == "__main__":url = "https://tieba.baidu.com/p/5997922755"photo_path = "./imgtieba/"page_num = get_page_num(url)for i in range(page_num):page_url = url + "?pn=" + str(i + 1)info = get_content(url)print(get_images(info, photo_path, i + 1, ".gif"))

社团课Day2-数据解析:Xpath、BeautifulSoup、re正则表达相关推荐

  1. 第二十七篇 网页数据解析三种方法: 正则表达--BeautifulSoup--xpath 满满的干货

    心得: 生活不允许自己懈怠自己,革命尚未成功,同志还须努力,有句话说的好,你尽管努力,剩下的交给天意. 我们从网页上抓取的原始数据大多都是html的数据格式,那如何从html中提取想要的字符串,得需要 ...

  2. python数据解析——xpath爬取文字和图片

    xpath解析:最常用且最便捷高效的一种解析方式,通用性. xpath解析原理: 1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中. 2.调用etree对象中的xpath方法 ...

  3. python爬虫数据解析xpath解析详细讲解——附有详细案例

    案例③由于时间流逝,网页爬取失效了 最近考研复试,增加一个案例,爬取985211学校,并以excel表格形式存储 文章目录 1.什么是xpath 是最常用的最广泛的数据解析方式 2.xpath解析原理 ...

  4. 爬虫之提取数据xpath/BeautifulSoup/css/正则(re)的基本使用

    提取数据常用的三种方法: 1.xpath方法 与lxml的etree配合使用 2.BeautifulSoup 3.正则 备注:主要掌握BeautifulSoup和xpath即可 1.xpath基本使用 ...

  5. 数据解析——xpath

    目录 一.安装 二.xpath基本语法 2.1.依赖 2.2.xpath语法 2.3.实例 2.3.1.html文件 2.3.2.python 三.获取百度网站首页的"百度一下" ...

  6. 2 爬虫 数据解析(bs4,XPath) robots协议 cookie反爬 代理反爬

    爬虫 1 数据解析 1.1 介绍 1.1.1 概念即作用 数据解析就是将一组数据中的局部数据进行提取,用于实现聚焦爬虫. 聚焦爬虫是建立在通用爬虫的基础上,从通用爬虫获取的整个源码数据中提取出指定的数 ...

  7. 3.3 数据解析之xpath解析

    数据解析–xpath解析 最常用最便捷高效的一种解析方式 1. 模块安装 pip install lxml from lxml import etree 2. 解析原理 实例化一个 etree 对象, ...

  8. python层级抓取_070.Python聚焦爬虫数据解析

    一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...

  9. python爬虫解析数据错误_Python网络爬虫数据解析的三种方式

    request实现数据爬取的流程: 指定url 基于request发起请求 获取响应的数据 数据解析 持久化存储 1.正则解析: 常用的正则回顾:https://www.cnblogs.com/wqz ...

最新文章

  1. 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
  2. 2020年全国大学生智能车竞赛华南赛区线上比赛高校组合
  3. WindowsServer2012史记4-重复数据删除的魅力
  4. Leetcode 171. Excel表列序号 解题思路及C++实现
  5. Linux中的SELinux详解--16
  6. Jboss未授权访问部署木马 利用exp
  7. jquery-weui滚动加载问题解决
  8. java 输出定位代码行_指定一个.java文件,输出其代码行数
  9. Sublime一些问题以及解决方法
  10. 雷林鹏分享:Ruby 发送邮件 - SMATP
  11. PyTorch入门(四)搭建神经网络实战
  12. rs232与db9接线方式
  13. mysql事物幻读_MySQL事务的幻读
  14. 计算机上键盘无法输入法,为什么键盘打不出字 大家都会用鼠标点击输入法图...
  15. tolua++实现分析
  16. CF连杀喊话_WeGame修改
  17. 媒体播控系统、信息发布系统 使用说明
  18. 十进制负数转化成二进制
  19. Tomcat介绍...
  20. 纪念金庸。创造了整整一个江湖。一个江湖的时代落幕了。。。

热门文章

  1. 三大数据分析工具对比 - 友盟 GrowingIO 神策数据
  2. 黑人抬棺用计算机演奏的乐谱,原神乐谱黑人抬棺怎么演奏_乐谱黑人抬棺_3DM手游...
  3. 从陌陌到挚文集团,名字变化背后还有什么故事?
  4. mui分页控件数据绑定封装
  5. 便利蜂java面试题_便利蜂20200507笔试题(Java)
  6. [SQL SERVER 2016]ABF文件的还原
  7. 机械/仪表领域北大核心期刊(摘自第九版)
  8. 给培训出来的Java程序员的一点建议,教你如何找工作
  9. 25 Top UI Tools for User Interface Engineers
  10. 尚硅谷笔记——React组件的三大属性props、state、ref