json与re的再次复习

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

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

 

一.json正则表达式

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

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

在python中,因为把json数据转化为pyth内建数据类型很简单,因此若是找到能返回json数据的url,就尽可能使用选择这种url。编码

咱们紧紧记住这一点,url

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

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

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

 

二.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转换回字符串类型,可是内容不变。
相关文章
相关标签/搜索