zoukankan      html  css  js  c++  java
  • 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(替换)

    一些常见的匹配符号:

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

    "d":匹配任意的数字

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

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

    匹配贪婪与非贪婪:

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

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

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

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

    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.点号默认匹配不到“' ”,"s"能够匹配空白字符,不仅仅包含空格,还有“ ”。

    那么,我将结合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转换回字符串类型,但是内容不变。
     
  • 相关阅读:
    Asp.net web api部署在某些服务器上老是404
    log4net记录日志到数据库自定义字段
    PIE-Basic 投影变换
    PIE-Basic 波段合成
    PIE-Basic 空间量测
    PIE-Basic 存储格式转换
    PIE-Basic 位深转换
    PIE-Basic 数据拉伸与显示
    PIE-Basic数据信息查看
    PIE-Basic 影像格式转换
  • 原文地址:https://www.cnblogs.com/Masterpaopao/p/10280108.html
Copyright © 2011-2022 走看看