# In[] # 正则表达式Regx ---- 字符串特殊匹配方式 设置格式进行匹配 import requests import re import os text = '''2月份,各地继续落实地方调控主体责任,坚持因城施策,促进房地产市场平稳健康发展。 据初步测算,4个一线城市新建商品住宅销售价格环比上涨0.3%,涨幅比上月回落0.1个百分点。 其中:北京下降0.2%,上海和广州分别上涨0.3%和1.1%,深圳持平。 二手住宅销售价格环比上涨0.15%。其中:北京和深圳分别上涨0.2%和0.5%,上海和广州分别下降0.1%和0.2%。 31个二线城市新建商品住宅销售价格环比上涨0.7%,涨幅连续三个月相同; 二手住宅销售价格环比下降20.21%,降幅比上月扩大0.1个百分点。 35个三线城市新建商品住宅销售价格环比上涨10.4%,涨幅比上月回落0.2个百分点; 二手住宅销售价格环比上涨0.2%,涨幅与上月相同18%,22.65431%。''' # 提取出文段中的百分比数 # ============================================================================= # '''步骤分析: # 1. 有共同的特点--- 都是以%结尾 # 2. %前面是数值 # 3. 数值之前是有. # 4. 点之前又是数值的 # ''' # ============================================================================= re.findall(r'd+.?d+%',text) # 观察到其中有整数百分比 还有小数百分比 所以在.之后加?表示小数点有就匹配到,没有就跳过 # d 表示匹配数值 加号修饰前一个字符 可以重复一次或无限次 # 小练习: 提取出上面文段中的某线城市 re.findall(r'.线城市',text) re.findall(r'[一二三四五六七八九十]线城市',text) re.findall(r'[d.d]*%',text) # 小练习 s = 'a你好ca如何cxxxa你你ca你何c' # 提起出其中的‘a你好c’ ‘a如何c’ re.findall(r'(a(你好|如何)c)',s) # In[] text1 = '''西楼尘 看过 2018-07-02 最费力的成长留在树上的只有壳,最狰狞的伤口留在皮肤的只有疤。最动人的烟火绽在空中看不到,最深沉的感谢飘进风中听不清。你教我食物最美味的吃法,却教我获得食物最羞耻的手法;我学会祈祷最灵验的手势,也学会用来祈祷最不齿的心愿。我在商店里偷换掉童年,你在泥土里掩埋了伤疤,而我们组成了家。 举报 7596 有用 凌睿 看过 2018-08-02 或是被第三者插足,或是不受父母待见,或是被辞退,或是父母根本不想把Ta生下来……这群被抛弃的人们,却共同组成了最温馨、最和睦、最融洽、最可爱的家庭。 他们或是失业,或是工伤,或是以偷窃维持生计,或是在风俗店工作,他们生活在社会的最底层,他们缺少物质财富,精神生活却无比充实。 他们每个人之间都没有血缘关系,但每个人都比原来的家庭过得更加快乐。 结婚不意味着幸福,被丈夫抛弃也能子孙满堂; 生了孩子不一定就是母亲,没有生育能力也可以给予母爱。 柴田治以为什么都教不了孩子,却教会了他什么叫青春期。 亚纪远离了富有的家庭,因为4号先生的肩膀更让她感到温暖。 由里遭到亲生父母虐待,却有一位素不相识的人愿意以失去工作的代价保护她。 富有富的活法,穷有穷的活法。我们在丰衣足食中颓废度日,他们在贫困交加中感受大爱无疆。 ''' # A 表示提取字符串的开头或者结尾 """ 问题: 提取其中的用户名 1. 不同的是第一个西楼尘之前没有空格 2. 所以用到 或与非 以及 首字符的提取 """ re.findall(r'A(.*) 看过',text1) # 提取到了开头 re.findall(r'有用 (.*) 看过',text1) # 提取到中间部分 # 将上面那两个很合并 用或连接 | re.findall(r'(有用 |A)(.*) 看过',text1) # 提取其中的日期 re.findall(r'd{4}-d{2}-d{2}',text1) re.findall(r'd+-d+-d+',text1) # In[] #v ========================================================================================= ## 爬取网站中的小说(剑来): http://www.shuquge.com/txt/8659/index.html # 首先获取网页的源代码 import requests import re import os url = 'http://www.shuquge.com/txt/8659/' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } r = requests.get(url , headers = headers) # 获取网页的源代码 r.text r.encoding = 'utf-8' # 发现得到的网页源代码有乱码部分 , 重新赋值编码格式 r.text # 使用正则表达式提取网址中需要的 就是随你改变网页变化的部分 chate_link = re.findall(r'<dd><a href="(.*)".*</a></dd>',r.text) # 拼接 将固定不变的部分和变换的部分进行拼接 a = 'http://www.shuquge.com/txt/8659/' for i in chate_link: print(a + i) # 把章节列表页代码打包成函数 #L = [] def list1(url): # ============================================================================= # """传入章节列表网址, 提取出对应小说的章节列表""" # ============================================================================= headers ={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } r = requests.get(url,headers = headers) r.encoding = 'utf-8' # 使用正则表达式提取网址中需要的 就是随你改变网页变化的部分 chate_link = re.findall(r'<dd><a href="(.*)".*</a></dd>',r.text) # 进行循环 将得到的 # for i in chate_link: # b = url+i # L.append(b) # return L return chate_link url = 'http://www.shuquge.com/txt/8659/' list1(url) # In[] # 例如爬去其中一章节的内容 url = 'http://www.shuquge.com/txt/8659/15605645.html' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} r = requests.get(url , headers = headers) r.encoding = 'utf-8' r.text wenben = re.findall(r'<div id="content" class="showtxt">(.*?)</div>',r.text,re.S)[0] # re.S 表示换行抓取 否则无法获取到结果 并且需要改为懒惰模式 、 # 因为需要的部分在最近的</div>之间 结果为列表 提取出来进行后续的操作 # 删除掉多余的字符 注意其中的换行符 <br /> 可以改变为 zuizhong = wenben.replace(' ','').replace(' <br/>',' '). replace(' <br />',' ').replace('<br />','').replace('<div id="content" class="showtxt">','') # 利用正则表达式 提取标题 title = re.findall(r'<h1>(.*)</h1>',r.text)[0] # 将得到的文本导出至本地 # open() 函数导入和导出 f = open('剑来.txt','w') # 在工作路径下创建文件 # 利用open函数写入文件 f.write(title) # 写入标题 f.write(' ') # 加入换行符 f.write(zuizhong) # 写入整理好的文件 f.close() # 关闭写入函数 # 将上面的代码整理为函数形式调用 def fun2(url): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} r = requests.get(url , headers = headers) r.encoding = 'utf-8' wenben = re.findall(r'<div id="content" class="showtxt">(.*?)</div>',r.text,re.S)[0] # re.S 表示换行抓取 否则无法获取到结果 并且需要改为懒惰模式 、 # 因为需要的部分在最近的</div>之间 结果为列表 提取出来进行后续的操作 # 删除掉多余的字符 注意其中的换行符 <br /> 可以改变为 zuizhong = wenben.replace(' ','').replace(' <br/>',' '). replace(' <br />',' ').replace('<br />','').replace('<div id="content" class="showtxt">','') # 利用正则表达式 提取标题 title = re.findall(r'<h1>(.*)</h1>',r.text)[0] return title , zuizhong fun2('http://www.shuquge.com/txt/8659/2324755.html') # In[] # ============================================================================= # 将上面的代码进行整合 变为一个函数可以一次性爬取该文章的所有章节 # 获取章节 zhangjie = list1("http://www.shuquge.com/txt/8659/") # 创建文件夹 import os if not os.path.exists('剑来'): # 创建名为剑来的文件夹 # 判断是否存在 如果存在,创建 如果不存在则不返回任何值 os.mkdir("剑来") # 对章节列表进行拼接 url = "http://www.shuquge.com/txt/8659/" n = 1 for i in zhangjie: print(url + i) a = url + i title,zuizhong = fun2(a) # 此时有了标题和文章内容 # 建立函数 将得到的标题和文章内容 放置文件夹中 并给予文章名 f = open('剑来/'+str(n)+'_'+title+".txt",'w',encoding = 'utf-8') # '剑来/'表示本地文件夹 加上文件名 此时得到的文件名称是无序的 # 在文件的前面加上数字进行排序 str(n) 表示狮子不能直接接在字符串上,需转换为字符型 # 写入内容 f.write(title) f.write(' ') f.write(zuizhong) n+ = 1 # 表示每一章结束在文件前加的数字上加1 实现自动排序