# 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>之间 结果为列表 提取出来进行后续的操作
# 删除掉多余的字符 注意其中的换行符 \r<br /> 可以改变为 \n
zuizhong = wenben.replace(' ','').replace('\r<br/>','\n').\
replace('\r<br />','\n').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('\n\n') # 加入换行符
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>之间 结果为列表 提取出来进行后续的操作
# 删除掉多余的字符 注意其中的换行符 \r<br /> 可以改变为 \n
zuizhong = wenben.replace(' ','').replace('\r<br/>','\n').\
replace('\r<br />','\n').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('\n\n')
f.write(zuizhong)
n+ = 1 # 表示每一章结束在文件前加的数字上加1 实现自动排序