python爬虫基础:day7

1,数据提取之jsonpath模块

使用场景:多层嵌套的复杂的字典,直接提取数据

#列表,里面元素是字典
dict1 = [
    {"蜀国": [
        {'name': '诸葛亮', 'age': 24, 'job': '军师'},
        {'name': '张飞', 'age': 24, 'job': '将军'},
        {'name': '关羽', 'age': 25, 'job': '将军'}
    ]},
    {"魏国": [
        {'name': '司马懿', 'age': 26, 'job': '军师'},
        {'name': '夏侯惇', 'age': 26, 'job': '将军'},
        {'name': '夏侯渊', 'age': 25, 'job': '将军'}
    ]},
    {"吴国": [
        {'name': '周瑜', 'age': 26, 'job': '军师'},
        {'name': '吕蒙', 'age': 28, 'job': '将军'},
        {'name': '凌统', 'age': 28, 'job': '将军'}
    ]},
]

import jsonpath
# 1,提取所有job的value值
# jsonpath可以根据key值的名称提取任意层级结构的value,返回一个列表
# $..  定位规则:定位任意层级结构的键值对
job_value_list = jsonpath.jsonpath(dict1,'$..job')
# print(job_value_list)
name_value_list = jsonpath.jsonpath(dict1,'$..name')
age_value_list = jsonpath.jsonpath(dict1,'$..age')
for name,age,job in zip(name_value_list,age_value_list,job_value_list):
    if '军师' == job:
        print(name,age,job)
"""需求2:提取所有的将军"""
# job_value_list = jsonpath.jsonpath(dict1, '$..job')
# name_value_list = jsonpath.jsonpath(dict1, '$..name')
# age_value_list = jsonpath.jsonpath(dict1, '$..age')
# for name, age, job in zip(name_value_list, age_value_list, job_value_list):
#     if '将军' == job:
#         print(name, age, job)
"""需求3:提取所有的将军,年龄不超过25岁"""
# job_value_list = jsonpath.jsonpath(dict1, '$..job')
# name_value_list = jsonpath.jsonpath(dict1, '$..name')
# age_value_list = jsonpath.jsonpath(dict1, '$..age')
# for name, age, job in zip(name_value_list, age_value_list, job_value_list):
#     if ('将军' == job) and (age < 25):
#         print(name, age, job)

 2,数据提取之正则

规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑

 

 使用体验:

import re
# 贪婪匹配,?非贪婪匹配
print(re.match('a*', 'aaaab').group())
print(re.match('a*?', 'aaaab').group(),'test')

#正则体验
# str1 = '<meta http-equiv="content-type" content="text/html;charset=utf-8"/>   adacc/sd/sdef/24'
# result = re.findall(r'<.*>', str1)  #除了换行外,都能匹配到
# print(result[0])

# print(re.findall('\d', "gdwjhebiowe1293"))  #\d匹配数字
# print(re.sub('\d', '_', 'qrferrwu23897ef2'))  #查找数字进行替换,返回新的字符串

# p =  re.compile('\d',re.S)  #编译模式,找数字,re.S 换行匹配  p预编译规则
# print(p.findall("wdguquee_efbubf3435vrte"))

 3,re模块的常见方法

pattern.match(从头找一个)

pattern.search(找一个)

pattern.findall(找所有)

贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配

非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配

pattern.sub(替换)

re.compile(编译)

​ 返回一个模型p,具有和re一样的方法,但是传递的参数不同

​ 匹配模式需要传到compile中

import re
# re.match(): 从头开始匹配,匹配的规则必须是从字符串开头开始定义规则
str1 = '<meta http-equiv="content-type" content="text/html;charset=utf-8"/>adacc/sd/sdef/24'
"""需求:提取content-type"""
# .*?: 匹配任意字符无限次(除去\n),不用去关注数据的长度
result = re.match('<meta http-equiv="(.*?)"', str1)  #()为分组,  .*?  非贪婪策略
print(result.group())
print(result.group(1))
print(result.groups())  #元组,匹配的组

"""需求:提取utf-8"""
result = re.match('<meta http-equiv="content-type" content="text/html;charset=(.*?)"', str1)
print(result.groups())


str1 = '<meta http-equiv="content-type" http-equiv="content1-type" content="text/html;charset=utf-8"/>adacc/sd/sdef/24'
# re.search(): 找到一个匹配结果就返回,匹配的结果:没有 or 有且只有一个
# 规则可以从任意位置开始
"""需求:提取http-equiv属性值"""
result = re.search('http-equiv="(.*?)"', str1)
print(result.groups())

str1 = '<meta http-equiv="content-type" http-equiv="content1-type" content="text/html";charset="utf-8"/>adacc/sd/sdef/24'
# re.findall(): 将符合规则结果全部返回
# 没有符合正则规则,返回的结果是一个空列表
"""需求:提取http-equiv属性值"""
# result = re.findall('http-equiv="(.*?)"', str1)
# print(result)
result = re.findall('="(.*?)"', str1)
print(result)

4,python中原始字符串 r 的用法

len('\n')
# 结果  1
len(r'\n')
# 结果  2
'\n'[0]
# 结果  '\n'
r'\n'[0]
# 结果  '\'

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值