用辅助函数取代复杂的表达式
urllib.parse的parse_qs函数,可以把url中暴露出来的查询参数拆分成键值对的形式,并把他们放进dict内
使用场景:爬虫处理url参数或者接口测试时处理url参数
from urllib.parse import parse_qs
url = "https://www.baidu.com/s?wd=1&rsv_spt=0&rsv_id="
args = url.split("?")[1]
my_values = parse_qs(args, keep_blank_values=True)
print(my_values)
结果
{'wd': ['1'], 'rsv_spt': ['0'], 'rsv_id': ['']}
{'wd': ['aa'], 'rsv_spt': ['0'], 'rsv_id': ['']}
从结果来看,我们看到有三种情况
1.有值
2.0
3.空值
那么针对0和空值,我们可以做一个特殊处理
下面会讲解有关f-str的用法
详情请参考上一篇文章: effective python-高级字符串格式化
"""
直接用Boolean表达式实现,若左边值为false,就取右边的0
"""
# 补充一下get语法,get()在这里如果没有对应的键,返回一个空值
wd = my_values.get('wd', [''])[0] or 0
rsv_spt = my_values.get('rsv_spt', [''])[0] or 0
rsv_id = my_values.get('rsv_id', [''])[0] or 0
# f-str的 {val!r} 用法 相当于 {repr(val)}
# repr() 方法可以将读取到的格式字符,比如换行符、制表符,转化为其相应的转义字符。
print(f"wd: {wd!r} ")
print(f"rsv_spt: {rsv_spt!r} ")
print(f"rsv_id: {rsv_id!r} ")
结果
wd: '1'
rsv_spt: '0'
rsv_id: 0
但发现个问题rsv_spt是字符串的0对于这些还要做一个int转换处理
rsv_spt = int(my_values.get('rsv_spt', [''])[0] or 0)
print("转换后rsv_spt:", rsv_spt)
结果
转换后rsv_spt: 0
看着就很乱,这时候就达不到我们想要的效果,而且可读性很差
# 可以使用if,else的三元表达式
rsv_spt_str = my_values.get('rsv_spt', [''])
rsv_spt = int(rsv_spt_str[0]) if rsv_spt_str[0] else 0
print("转换后rsv_spt:", rsv_spt)
结果
转换后rsv_spt: 0
越看越乱,对于不同的url传过来,还要重写一遍,非常麻烦
# 可以通过使用辅助函数解决问题
def get_first_int(values, key, default):
found = values.get(key, [''])
if found[0]:
return int(found[0])
else:
return default