json与re的再次复习

在浏览本文之前,建议先温习一下以下博客的链接:

https://www.cnblogs.com/Masterpaopao/p/10061575.html

 

一.json

json,在爬虫中毫无疑问扮演着极为重要的角色:

JSON是一种轻量级的数据交换格式,适用于进行数据交互的场景。

在python中,由于把json数据转化为pyth内建数据类型很简单,所以如果找到能返回json数据的url,就尽量使用选择这种url。

我们牢牢记住这一点,

json.loads() --> 把json数据转换为python数据,转换之后的数据类型是字典。

json.dumps()-->把python数据转换为json数据,转换之后的数据类型是字符串,但是你在输出中可能会看不见有引号的存在,格外注意这一点。

那么有时候处理数据的时候,我们想要保留json的原形态,显示其编码,在括号内传递一个ensure_ascii=False的参数

 

二.re

①re.findall

re.findall功能:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

总结:re.findall的输出是列表。

 

常用正则表达式的方法:

 

re.compile(编译)
re.match(从头找一个)
re.search(找一个)
re.findall(找所有)
re.sub(替换)

 

 

一些常见的匹配符号:

   .   :匹配所有字符除换行符“\n

"\d":匹配任意的数字

"\w":匹配数字和字母以及下划线

"\s":匹配空白符号,包括相关制表符

 

匹配贪婪与非贪婪:

 

* :匹配前一个字符0或无限次
+ :匹配前一个字符1次或者无限次
? :匹配前一个字符0次或1次
{m} :匹配前一个字符m次
常用的匹配方式:
.*? :以*和?贪婪的方式匹配所有

 

②(.*?): 匹配出来括号内的内容

③([\s\S]*?):匹配出来括号内的内容

针对①和②的内容写出一个代码论证:

 

import re
a="abc123qwe456!@#$555"
b=re.findall("abc.*?555",a)
print(b)
c=re.findall("abc(.*?)555",a)
print(c)
输出结果:
['abc123qwe456!@#$555']
['123qwe456!@#$']

 

我们可以对比b和c的输出结果,首先,这两者的输出结果都是列表,这是毫无疑问的,这个需要紧紧记住。

然后就是括号和无括号的区别,无括号的时候匹配出来所有,

有括号的时候,括号两旁的字符成了定位字符,只匹配出来括号内的内容。

 

②re.sub

 

re.sub用于替换字符串中的匹配项,是对字符串的指定部分进行正则替换操作的函数。公式如下:

re.sub(pattern, repl, string, count=0, flags=0)

pattern是字符串中要更换的部分,repl是更换的内容,string是原始字符串。

count是需要更换的次数,按顺序更换。其中,count=0是默认替换全部,而不是替换0个。

flags是可选的,表示匹配模式,比如忽略大小写,多行模式等

 

只需要注意一下输出的结果是字符串,具体的请参考我开头贴的博客,具体我就不再复述了。

 

 

正则使用的注意点:

1.re.findall("a(.*?)b","str")能够返回括号中的内容,括号前后的内容起到定位和过滤的效果。

2.原始字符串,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果。

3.点号默认匹配不到“'\n”,"\s"能够匹配空白字符,不仅仅包含空格,还有“\t”。

 

那么,我将结合json和re来实战一个简单的爬虫,帮助大家更好的理解:

 

import requests
import json
import re

url="https://36kr.com/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"}
html_1=requests.get(url,headers=headers)
html_2=html_1.content.decode()
print(html_2)

ret=re.findall("<script>var props=(.*?),locationnal=",html_2)[0]
html=json.loads(ret)
with open("36k.html","w",encoding="utf-8") as f:
f.write(json.dumps(html,ensure_ascii=False))
 
这段代码完美地融合了本片讲到的知识点,希望大家可以好好理解这段代码。
我先回答一个疑问,有人会认为json.loads()和json.dumps()可以直接去掉,其实是不一样的。
你去掉之后,你会发现得到的文件没有经过格式转化:
我们先json.loads()转换为python文本格式,确保我们可读代码,
然后再json.dumps转换回字符串类型,但是内容不变。
 

 

posted @ 2019-01-16 23:41  Master跑跑  阅读(456)  评论(0编辑  收藏  举报