正则
匹配字符串
正则表达式必备技能:
元字符:(单个字符)
1,普通字符
2, 特殊字符
. 匹配所有文字符号,除了换行
\w 匹配数字,字母,下划线
\d 匹配数字
\W 匹配除了数字,字母,下划线
\D 匹配除了数字
^ 匹配一句话得开头
$ 匹配一句话得结尾
[abc] 字符组 等于 \w
[^abc] 字符组 非字符组 等于 \W
3,量词
用来修饰前面得一个单位的出现次数
* 表示出现0次或者更多次
+ 表示出现一次或者更多次
? 表示出现0次或者1次
{n}表示出现n次 # \d{3} 表示出现3个数字
4 ,贪婪匹配
默认的量词(,+,?)都是尽可能多的匹配内容
5 , 惰性匹配
a.
?x (匹配到a和第一个x就结束)惰性匹配,尽可能少的匹配,回溯算法

import re # 关于处理正则表达式的一个模块lst = re.findall(r"\d+","哈哈99呵呵88嘿嘿77")
print(lst)  # \d 匹配数字
#['99', '88', '77']it = re.finditer(r"\d+","哈哈99呵呵88嘿嘿77")
for item in it:print(item.group())# 99# 88# 77it = re.finditer(r"\d+","1哈哈哈sdasd12123ha4562哈哈哈78922")
# 默认匹配第一个数字
obj = it.__next__()
print(obj.group())
#1
# 正则遍历所有数字
for item in it:print (item.group())
# 1
# 12123
# 4562
# 78922##   match 默认从开头匹配  只能匹配一次
result = re.match(r"\d+","123456哈哈99呵呵88嘿嘿77")
print(result.group())
# 123456## search 查找得到第一个结果就返回
result1 = re.search(r"\d+","哈哈123456哈哈99呵呵88嘿嘿77")
print(result1.group())
# 123456obj = re.compile(r"www\.baidu\.com")
it = obj.finditer("www.baidu.com,www.jd.com")
for item in it:print(item.group())  #  www.baidu.com##括号括起来的内容是你想要的结果
##(?P <name>)
obj = re.compile(r"www\.(?P<gpc>baidu|jd)\.com")
it = obj.finditer("www.baidu.com,www.jd.com")
for item in it:print(item.group("gpc"))   # baidu#jdobj = re.compile(r"www\.(baidu|jd)\.com")
it = obj.findall("www.baidu.com,www.jd.com")
print(it)
# ['baidu', 'jd']

from urllib.request import urlopen  #爬虫url模块
import re# 打开网页url,拿到页面源代码
content = urlopen("https://news.163.com/").read().decode("gbk")
# print (content)
obj = re.compile(r'<div class="mod_top_news2" id="js_top_news">.*?">(?P<title>.*?)</a>',re.S)
lst = obj.findall(content)
print(lst)


补:分析浏览器开发者工具中Elements和network这两个选项卡对应的页面源码数据有何不同之处?

  • Elements中包含的显示的页面源码数据为当前页面所有的数据加载完毕后对应的完整页面数据源码(包含了动态加载的数据)
  • network中显示的页面源码数据仅仅为某一个单独的请求对应的相应数据(不包含动态加载数据)
    结论:如果在进行数据解析的时候,一定需要对页面布局进行数据分析,如果当前网站没有动态加载的数据可以直接使用Elements对页面布局进行分析,否则只可以使用network对页面数据进行分析。
    如下图 静态网站:


动态加载:




使用正则提取校花网图片链接

# -*- coding: utf-8 -*-
import requests
import urllib
import re
import osdirName = "校花图片" #定义文件名字
if not os.path.exists(dirName): #3 判断是否存在该文件os.mkdir(dirName)  # 如果不存在该文件则创建headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
} #模仿浏览器UA头
url = "http://www.521609.com/daxuemeinv/" #目标url
page_text = requests.get(url=url,headers=headers).text #捕获到当前首页的页面源码数据
ex = '<li>.*?<img src="(.*?)" width=.*?</li>' # 从当前获取的页面源码数据中解析出图片地址
img_src_list = re.findall(ex,page_text,re.S) # 调用获取到的页面源码以及加上re解析的参数信息  #re.S作用于正则换行
for src in img_src_list:print(src)src = "http://www.521609.com"+src #解析出来的url并不完整需要进行拼接imgpath = dirName + '/'+src.split('/')[-1] #为图片进行命名urllib.request.urlretrieve(src,imgpath) #下载图片print(imgpath,"下载完成")

bs4

  • bs4 解析原理

    • 实例化一个BeautifulSoup的对象,且将待解析的页面源码数据加载到该对象中
    • 调用BeautifulSoup对象中相关方法或者属性进行标签定位和文本数据提取
  • 环境安装
    • pip install lxml #解析器
    • pip install bs4
  • BeautifulSoup对象的实例化:
    • BeautifulSoup(fp,‘lxml’):用来将本地存储的html文档中的数据进行解析
    • BeautifulSoup(page_text,‘lxml’):用来将互联网上请求到的页面源码数据今夕解析
  • 标签定位:

- soup.tagName:只可以定位到第一次出现的TagName标签

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
# with open("三国.html","w",encoding="utf-8") as f:
#     f.write(page_text)
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
print(soup.li) #soup.tagName:只可以定位到第一次出现的TagName标签


- soup.find(‘tagName’,attrName=‘value’):属性定位

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
# with open("三国.html","w",encoding="utf-8") as f:
#     f.write(page_text)
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
print(soup.find('div',class_="book-mulu")) #soup.find('tagName',attrName='value'):属性定位


# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
# with open("三国.html","w",encoding="utf-8") as f:
#     f.write(page_text)
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
print(soup.find('div',id="top_right_nav")) #soup.find('tagName',attrName='value'):属性定位
print(soup.find('p',class_="des"))

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
# with open("三国.html","w",encoding="utf-8") as f:
#     f.write(page_text)
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
print(soup.find('p',class_="des")) #soup.find('tagName',attrName='value'):属性定位
print(soup.findAll('p',class_="des"))# 跟find一样用于属性定位,只不过findAll返回的是列表


soup.select(“选择器”)

  • 类选择器
  • id选择器
  • 层级选择器

> : 表示一个层级

:空格表示多个层级

如下:

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
# with open("三国.html","w",encoding="utf-8") as f:
#     f.write(page_text)
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
print(soup.select('.book-mulu > ul > li >a')) #soup.select("选择器")  > : 大于号表示一个层级
print(soup.select('.book-mulu a')) #空格表示多个层级

文本数据提取:

  • .text : 返回的是改标签下的所有文本内容
  • .string: 返回的是改标签直系下的文本内容
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
a_href = soup.select('.book-mulu > ul > li >a')
for a in a_href:print(a.string)#a.text


取url属性

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
a_href = soup.select('.book-mulu > ul > li >a')
for a in a_href:print(a['href'])#属性提取

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoupfp = open("三国演义.txt","w",encoding="utf-8")
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
page_text = requests.get(url=url,headers=headers).text
soup = BeautifulSoup(page_text,'lxml') #实例化一个BeautifulSoup对象
a_list = soup.select('.book-mulu > ul > li >a')
for a in a_list:title = a.string  #中文名字detail_url = "http://www.shicimingju.com" + a ['href'] #解析出来的url地址# 对详情页发起请求解析出章节内容page_text_detail = requests.get(url=detail_url,headers=headers).textsoup = BeautifulSoup(page_text_detail,'lxml')div_tag = soup.find('div',class_="chapter_content")content = div_tag.textfp.write(title+':'+content+"\n")print(title,"保存成功!!!")
fp.close()

04-正则解析+bs4基础爬虫相关推荐

  1. Python学习,还在用正则或者bs4做爬虫吗?来试试css选择器吧

    之前写的一些爬虫都是用的正则.bs4.xpath做为解析库来实现,如果你对web有所涉及,并且比较喜欢css选择器,那么就有一个更适合的解析库-- PyQuery.我们就用一个非常简单的小例子来看看c ...

  2. 数据解析学习笔记(正则解析、bs4解析、xpath解析)

    聚焦爬虫:爬取页面中指定的页面内容. - 编码流程: - 指定url - 发起请求 - 获取响应数据 - 数据解析 - 持久化存储 数据解析分类: 正则 bs4 xpath(***) 数据解析原理概述 ...

  3. Python|http|Chrome Developer Tools|Postman|HTTPie|builtwith库|python-whois库|爬虫及解析|语言基础50课:学习(10)

    文章目录 系列目录 原项目地址 第31课:网络数据采集概述 爬虫的应用领域 爬虫合法性探讨 Robots协议 超文本传输协议(HTTP) 相关工具(Chrome Developer Tools.Pos ...

  4. Python爬虫 BeautifulSoup(bs4)-- bs4介绍、安装bs4、bs4基础语法

    1. BeautifulSoup简介 BeautifulSoup简称: bs4 . 什么是BeatifulSoup? BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解 ...

  5. Python3 Requests+BS4网络爬虫:最详细零基础的获取百度快照链接爬虫教程(思路篇)

    Hello,大家好呀,五一劳动节快乐呀!最近在后台接到一个粉丝的私信说怎么爬取百度快照.正好五一有一段时间休息,咱们就来水一篇文章,顺便来巩固巩固基础的知识. 注意注意!这是思路篇,没有代码!只有思路 ...

  6. python爬虫正则解析及xpath解析,lxml解析库

    正则解析模块re re模块使用流程 方法一 r_list=re.findall('正则表达式',html,re.S) 方法二 # 1.创建正则编译对象 pattern = re.compile('正则 ...

  7. python爬虫设计思路_python网络爬虫(9)构建基础爬虫思路

    目的意义 基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备. 这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释 ...

  8. 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...

    商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...

  9. BeautifulSoup主要介绍与基础爬虫项目实践

    强大的BeautifulSoup 1.简要介绍 BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. ...

最新文章

  1. 微服务化的数据库设计与读写分离
  2. 基于场景建模的自动化配置
  3. 同一个电脑安装两个jdk版本
  4. angularjs移除不必要的$watch
  5. 「日常训练」Skills(Codeforce Round #339 Div.2 D)
  6. idea 玩转 码云 -- idea安装码云插件
  7. 信息奥赛一本通(1099:第n小的质数)
  8. 【java笔记】函数式接口
  9. centos启动提示unexpected inconsistency RUN fsck MANUALLY
  10. ecshop 邮件模板 html,给ecshop后台增加新的邮件模板
  11. 半小时实现Java手撸网络爬虫框架!!(附完整源码,建议收藏)
  12. MCGS 昆仑通态触摸屏 modbus TCP 数据转发
  13. 倍福plc有什么优点_BECKHOFF倍福安全模块的优点和缺点
  14. 编译和push services.jar的方法
  15. 后盾网 html语言视频教程,后盾网HTML5视频教程-
  16. 利用Python和OpenCV将图像灰度图转为3D图并显示
  17. 增量式编码器c语言,增量式编码器
  18. 不要嫌我啰嗦~继续话痨python
  19. 微信记录怎么恢复?恢复已删除微信历史记录的4种方式
  20. 手机安装软件解析包错误解决办法

热门文章

  1. python进程共享全局变量 时延_Python 进程之间共享数据(全局变量)的方法
  2. matlab向量的模_基于MATLAB使用矩阵方法求解一维定态薛定谔方程
  3. java并查集计算机网络连通,poj2236 Wireless Network(并查集)
  4. oracle 11g 清除 trc后缀文件,请教一个跟踪文件的问题。11g 很多trc文件。。
  5. 谷歌新语言重写android,谷歌将推新设计语言 安卓APP用户界面将换新颜
  6. mockjs vue ajax,mockjs在vue中的使用
  7. matlab narxnet,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?
  8. java程序设计复习题_java程序设计复习大全(100题及答案).doc
  9. k8s 查看mysql 日志_k8s 使用 Init Container 确保依赖的服务已经启动
  10. ajax工具怎么安装,AJAX工具