python正则表达式--爬取百度文库内容

python 正则表达式

正则表达式是用来简洁表达一组字符串地表达式,是通用的字符串表达框架

正则表达式由字符和操作符组成:

操作符说明
.表示任何单个字符(除了换行)
[ ]字符集,对单个字符给出取值范围,[abc]表示a、b、c中任一个,[a-z]表示a到z的单个字符
[^]非字符集,对单个字符给出排除范围,[^abc]表示除了a、b、c之外的的单个字符
*前一个字符0次或多次扩展 abc* 表示:ab、abc 、abc 、abcccc等
+前一个字符1次或多次扩展
前一个字符0次或者1次扩展
|左右表达式任意一个 abc|def 表示abc 或者def
{m}扩展前一个字符m次
{m,n}扩展前面的一个字符m至n次(含n)
^匹配字符串开头 ^abc表示一个字符串的开头为abc
$匹配字符串结尾 abc$ 表示一个字符串的结尾为abc
( )分组标记,内部只能使用|操作符 (abc)表示abc ,(abc|def) 表示abc或者def
\d十进制数字 ,介于[0-9]
\D匹配任何非数据字符,等价于[^0-9]
\s匹配任何空白字符;等价于[\f\n\r\t\v]
\S匹配任何非空白字符
\w单词字符,等价于[A-Za-z0-9 _ ]增加 A-Z,a-z,0-9和下划线_
\W匹配任何非单词字符
\b匹配单词的开始或结束
\B匹配不是单词的开头或者结束的位置
\1…\9匹配第n个分组的内容。 分组是()
{:n}拓展一个字符0-n次,包含n
^[A-Za-z]+$  由26个字母组成的字符串
^[A-Za-z0-9]+$  由26个字母和数字组成的字符串

re库

标准库,用于字符串匹配

re库采用raw string 类型表示正则表达式,格式: r’text’

raw string 类型是原生字符串类型,不包含转义符的字符串

re库主要功能函数

  1. re.search()

在一个字符串中搜索匹配的正则表达式的第一个位置,返回match对象

  1. re.match()

从一个字符串的开始位置起匹配正则表达式,返回match对象

  1. re.findall()

搜索字符串,以列表类型返回全部能匹配的子串

  1. re.split()

将一个字符串按照正则表达式匹配的结果进行分隔,返回列表

  1. re.finditer()

搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象

  1. re.sub()

    在一个字符串中替换所有匹配的正则表达式的子串,返回替换后的字符串

函数的使用方法

  1. re.search(pattern,string,flags=0)

    pattern: 正则表达式的匹配字符串

    string: 待匹配的字符串

    flags: 正则表达式使用时的控制标记

    常用标记:

    缩写全写说明
    re.Ire.IGNORECASE忽略正则表达式的大小写 [A-Z]可以匹配小写
    re.Mre.MULTILINE正则表达式中^操作符能够将给定字符串的每行当作匹配开始
    re.Sre.DOTALL正则表达式中的.操作符能够匹配所有字符。默认.操作符匹配除换行符外的所有字符
  2. re.match(pattern,string,flags=0)

  3. re.findall(pattern,string,flags=0)

    返回列表类型

  4. re.split(pattern,string,maxsplit=0,flags=0)

    maxsplit:最大分割数,剩余部分作为最后一个元素输出

    将匹配的部分会去掉,其他的部分作为分隔的部分

  5. re.finditer(pattern,string,flags=0)

  6. re.sub(pattern,replace,string,count=0;flags=0)

    replace:替换匹配字符串的字符串

    count: 匹配的最大替换次数

re库的使用

函数式用法

一次性操作

rst.re.search(r’[1-9]\d{5}’,“BIT 100081”)

面向对象用法

编译后的多次操作

pat=re.compile(r’[1-9]\d{5}’) 编译

rst=pat.search(“BIT 100081”)

regex=re.compile(pattern,flags=0)
将正则表达式的字符串形式编译成正则表达式对象

re的match对象

match对象的属性

属性说明
.string待匹配的文本
.re匹配时使用的pattern对象(正则表达式)
.pos正则表达式搜索文本的开始位置
.endpos正则表达式搜索文本的结束位置

match对象的方法

方法说明
.group(n)获得匹配后的第n个元素
.start()匹配字符串在原始字符串的开始位置
.end()匹配字符串在原始字符串中的结束位置
.span()返回(.start(),.end()) 元组类型

贪婪匹配

re库默认采用贪婪匹配,即输出匹配的最长的子串

r'py.*N'

最小匹配

输出匹配的最小的子串

r'py.*?N' (加一个问号?)

*? 前一个字符0次或多次,最小匹配

+? 前一个字符1次或多次,最小匹配

?? 前一个字符0次或1次,最小匹配

{m,n}? 扩展前一个字符m至n次(含n),最小匹配

Re在线网站

https://tool.oschina.net/regex?optionGlobl=global
https://c.runoob.com/front-end/854

实例- -爬取百度文库内容

爬取百度文库的内容:
https://wenku.baidu.com/view/51d0d382e418964bcf84b9d528ea81c759f52e50.html

文档

F12查看网页源代码

该网页是动态加载的:

可以手动点击,使之加载完成

每一个<div id=pageNo-n … 块都包含了一张需要的内容

可以复制出包含所有的这些块的html代码,用正则表达式提取出其中的图片的url

找到几个目标URL分析共同点:

https://wkbjcloudbos.bdimg.com/v1/docconvert5999/wk/84d37f07f0d6bb5035745541741807d7/0.png?r
esponseContentType=image%2Fpng&responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C
%2011%20Jul%202021%2012%3A46%3A31%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc
85045ce7179e%2F2021-05-27T04%3A46%3A31Z%2F3600%2Fhost%2Fd314acbd7e3945d671b38fd3291b12fa6230
93b0a416c6644e2ab3d796978a5c&x-bce-range=1433702-1465976&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxL
jAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTYyMjA5NDM5MSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250Z
W50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.KEB
4MWf6qyaZe1bU4D0eWwe0w683s73aBrl8LGJVyO4%3D.1622094391


https://wkbjcloudbos.bdimg.com/v1/docconvert5999/wk/84d37f07f0d6bb5035745541741807d7/0.png?r
esponseContentType=image%2Fpng&responseCacheControl=max-age%3D3888000&responseExpires=Sun%2C
%2011%20Jul%202021%2012%3A46%3A31%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc
85045ce7179e%2F2021-05-27T04%3A46%3A31Z%2F3600%2Fhost%2Fd314acbd7e3945d671b38fd3291b12fa6230
93b0a416c6644e2ab3d796978a5c&x-bce-range=1465977-1510087&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxL
jAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTYyMjA5NDM5MSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDb250Z
W50VHlwZSIsInJlc3BvbnNlQ2FjaGVDb250cm9sIiwicmVzcG9uc2VFeHBpcmVzIiwieC1iY2UtcmFuZ2UiXX0%3D.Et
YsvSe0rcUPqcR607Zag87P6A47wiWkPZwvICTz%2FAw%3D.1622094391
匹配字符串可以为:
pattern=r'https://wkbjcloudbos.bdimg.com/.*?%3D\.\d{10}'

python提取目的URL地址:

import re
html='''

复制出来的html代码片段
.....
'''
#用于初步提取出URL
pattern=r'https://wkbjcloudbos.bdimg.com/.*?%3D\.\d{10}'   
#在html中& 是用'&amp;' 来表示的,所以要将'&amp;’替换为'&'
pattern_amp=r'&amp;'
regex=re.compile(pattern)
regex_amp=re.compile(pattern_amp)

links=regex.finditer(html)
# 判断获取的URL的数量
#print(sum(1 for _ in links))
for i in links:
    #获得URL
    link=regex_amp.sub("&",i.group()) 
	print(link)

python根据提取的URL下载保存图片:

import re
import requests

html='''

复制出来的html代码片段
.....
'''

#用于初步提取出URL
pattern=r'https://wkbjcloudbos.bdimg.com/.*?%3D\.\d{10}'   
#在html中& 是用'&amp;' 来表示的,所以要将'&amp;’替换为'&'
pattern_amp=r'&amp;'
regex=re.compile(pattern)
regex_amp=re.compile(pattern_amp)

links=regex.finditer(html)
# 判断获取的URL的数量
#print(sum(1 for _ in links))
number=0
for i in links:
    #获得URL
    link=regex_amp.sub("&",i.group()) 
    #print(link)
    response=requests.get(link)
    
    #这里的状态码不是200,是206
    if(200<=response.status_code<300):
        #在当前路径下必须要有photo文件夹
        f=open("photo/%d.png"%number,'wb')
        f.write(response.content)
        f.close()
    else:
        print(response.status_code)
        print("第%d张图片出错了"%number)
    number+=1    

结果:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值