活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程。您可以从以下3个方面任选其一着手(不强制),或者按照自己的理解发布专栏学习作品,参考如下:
**
学习日记
**
1,学习知识点
正则表达式
正则本质就是一个字符序列用于检测一个字符串是否与我们给的条件匹配
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾。 |
. | 匹配除‘\n’之外的任何单个字符。要匹配包括‘\n’在内的任何字符,请使用象’[.\n]'的模式。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配0个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{n} | 匹配n个前面表达式。列如,’o{2}‘不能匹配’bob‘中的’o‘,但能匹配’food‘中的两个o。 |
re{ n, } | 精准匹配n个前面表达式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等价于"o+”。"o{0,}“则等价于"o*”。 |
re{n,m} | 匹配n到m次由前面的正则表达式定义的片段,贪婪模式 |
(re) | 匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i,m,x.只影响括号中的区域。 |
(?-imx) | 正则表达式关闭i,m,x可选标志。只影响括号中的区域。 |
(?: re) | 类似(…),但是不表示一个组 |
(?imx:re) | 在括号中使用i,m或x可选标志 |
(?-imx:re) | 在括号中不使用i,m或x可选标志 |
(?#…) | 注释. |
(?= re ) | 前向肯定界定符。如果所含正则表达式,以…表示,在当前位置成功匹配时成功,否则失败,还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。当表达式不能匹配时则成功。 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配包含下划线的任意单词字符 |
\W | 匹配任意非单词字符。 |
\s | 匹配任意空白字符,包括空格、制表符、换页符等等。 |
\S | 匹配任意非空白字符 |
\d | 匹配任意数字。 |
\D | 匹配一个非数字字符。 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等。 | 匹配一个换行符。匹配一个制表符, 等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
修饰符-可选标志 | |
多个标志可以通过按位OR( | )来指定。例如:re.I |
模式 | 描述 |
-------- | ----- |
.I | 使匹配对大小写不敏感 |
.L | 使本地化识别(locale-aware)匹配 |
.M | 多行匹配,影响^和$ |
.S | 使.匹配包含换行在内所有字符 |
.U | 根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B |
.X | 该标志通过给灵活的格式,从而是你的正则写的更易于理解。 |
运算符优先级 | |
从左向右进行运算,并遵循优先级 | |
相同从左至右,不同由高到低 |
由高到低
\ --转义符 (),(?; ),(?=),[] --圆括号和方括号
*,+,?,{n,}.{n,m} --限定符 ^,$,\ --任何元字符、任何字符 定位点和序列(即:位置和顺序)
re模块
下一章说,直接上实战
实战案例
目标:轻小说文库,要求:爬某一网站的小说内容并下到桌面文档
保存为桌面-test文件夹
小说为魔女之旅 第一卷
import requests
import re
i=82491
def get_dict(number):
url = 'https://www.wenku8.net/novel/2/2255/{}.htm'.format(number)
hea = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
html = requests.get(url, headers=hea)
# html.encoding='utf-8'#utf-8依然乱码
MyHtml = html.text.encode('iso-8859-1').decode('gbk') # 解析成功
ti = r'<title>(.*?)</title>' # 标题
title = re.findall(ti, MyHtml, re.S)
tet = r' (.*?)<.*?' # 正文(相当简单的正则,直接检索特定字符后的内容)
test = re.findall(tet, MyHtml, re.S)
out_path = r'C:\Users\lenovo\Desktop\test\{}.txt'.format(number)#存储位置
with open(out_path, "a+", encoding='utf-8-sig') as f: # 打开文件
f.write(str(title) + "\n") # 写入小说内容
f.write(str(test)+'\n')
while i<82508:
get_dict(i)
i = i + 1
#测试成功逻辑上还是有点问题,如果i不受限,应该是可以抓到全部内容,不过仅仅是抓到,
后期改进一下,比较也没用多少时间写这个。
2,学习遇到的问题
大佬们您看看有什么可以精进的地方,我纯纯小白,感觉写的啥都不是。
3,学习的收获
回顾了re模块和正则的使用
实现对轻小说文库的爬取
下一章有具体说明
下一章将再明天晚上0点准时发,记得关注
…
提醒:在发布作品前请把不用的内容删掉(活动地址请保留)