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转换回字符串类型,但是内容不变。
     
  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/Masterpaopao/p/10280108.html
Copyright © 2011-2022 走看看