写在前面
为什么要把数据类型作为理论系列第一章呢?其实呢我们使用爬虫得到的数据需要处理,比如字符串,字典,列表,元组,我们爬取的数据就是这些类型,如何操作数据成为我们想要的.就需要熟练掌握这些数据类型的API,就像spider实战系列爬取一人之下那一文中Spider实战系列-抓取《一人之下第三季》_浅辄的技术博客_51CTO博客里的密钥解密那一部分,就使用了字符串替换.我个人是学Java出身的,因为Java是驼峰命名,而且还是个强类型语言,但python就不一样,定义一个变量就能使用,哈,其实有时候还是挺不方便的.
所以,爬虫要想学好,下面的数据类型操作要熟练使用.
数据类型
一.基础数据类型
- int
#int:整数,加减乘除,大小比较
a=10
- float
#float:小数
a=10.5
print(a)
print(10/3) #小数:数据范围是无限的。整数:在某一个特定的区间内是可以表示的很清楚的
#1~100000000
#0~1
#计算机是一个二进制的产品:0,1
#计算机表示一个小数是会有误差的,
- boolean
#bool:用来做条件判断的
# 取值范围:True,False
#基础数据类型之间的转化
a ='10'
print(type(a))
b=int(a)#把字符串转化成int()
print(type(b))
a=10 #在python中,所有的非零的数字都是True,零是Fasle
b=bool(a)
print(type(b))
print(b)
while 1: #死循环,恒为真
print("给我钱")
s = ""#在python中,所有的非空字符串都是True,空字符串是False
print(bool(s))
#综上,在pythont中,表示空的东西都是False,不空的东西都是True
二.字符串
1.字符串格式化
#字符串的格式化问题
#我叫xxx,我住在xxx,我几年xxx岁,我喜欢xxx
name = input("输入你的名字:")
address = input("输入你的地址:")
age = int(input("输入你的年龄:"))
hobby = input("输入你的爱好:")
# %s字符串占位
# %d占位整数
# %f占位小数
s = "我叫%s,我住在%s,我几年%d岁,我喜欢%s" % (name,address,age,hobby)
s1 = "我叫{},我住在{},我几年{},我喜欢{}".format(name,address,age,hobby)
s2 = f"我叫{name},我住在{address},我几年{age},我喜欢{hobby}"# f-string
print(s)
2.索引和切片
# 索引和切片
# 索引:按照位置提取元素
s = "我叫Lee"
# 可以采用索引的方式来提取某一个字符(文字)
print(s[2]) # 程序员都是从0开始数数
print(s[-1]) # -表示倒数
# 切片:从一个字符串中提取一部分内容
s = "我是Lee,你是小黄么"
print(s[3:6]) # 从索引3位置进行切片,切到6结束 坑:切片拿不到第二个位置的元素
# 语法:s[start:end]从start到end进行切片,但是取不到end[start,end)
print(s[0:6])
print(s[:6]) # 如果start是从开头进行切片,可以省略
print(s[6:]) # 从start开始一直截取到末尾
# : 如果左右两端有空白,表示开头或者结尾
print(s[:])
print(s[-3:-1]) # 目前还是只能从左往右切片
print(s[-1:-3]) # 没结果,这是个坑!!!
s = "我爱你"
# 可以给切片添加步长来控制切片的方向
print(s[::-1]) # 一表示从右往左
# 语法:s[start:end:step]从start切到end,每step个元素选出来一个元素
s="abcdefghijklmnopq"
print(s[3:8:2])
print(s[-1:-10:-3])
3.常用操作
# 字符串常用操作
# 字符串的操作一般不会对原字符串产生影响,一般是返回一个新的字符串
# 3.1字符串大小写转换
s = "python"
s1 = s.capitalize()
print(s1)
s = "I have a dream!"
s1 = s.title() # 单词的首字母大写
print(s1)
s = "I HAVE A DREAM"
s1 = s.lower() # 变成小写字母
print(s1)
s = "i have a dream"
s1 = s.upper() # 把所有字母变成大写字母
print(s1)
# 如何忽略大小写来进行判断 => upper()
verify_code = "xAd1"
user_input = input(f"请输入验证码({verify_code}):")
if verify_code.upper() == user_input.upper():
print("验证码正确")
else:
print("验证码不正确")
4.切割和替换
# 3.2替换和切割(*)
# strip() 去掉字符串左右两端的空白符(空格,\t,\n)
s = " 你好 , 我是 Lee"
s1 = s.strip()
print(s1)
# 案例
username = input("请输入用户名:").strip()
password = input("请输入密码:").strip()
if username == "admain":
if password == "123456":
print("登陆成功")
else:
print("登陆失败!")
else:
print("登陆失败!")
# replace(old,ne)字符串替换
s = "你好呀,我是刘德华"
s1 = s.replace("刘德华", "彭于晏")
print(s1)
a = "hello i am a good man!"
a1 = a.replace("", "") # 去掉所有的空格
print(a1)
# split(用什么切割) 字符串切割 用什么切,就会损失掉谁,
a = "python_java_c_c#_javascript"
lst = a.split("_") # 切割之后的结果会放在列表当中
print(lst)
lst = a.split("_java")
print(lst)
5.查找和替换
# 查找和判断
s = "你好啊,我是吴彦祖是"
ret = s.find("我") # 返回如果是一1就是没有该字符串出现 只会查找出第一次出现的
print(ret)
ret = s.index("我") # 如果报错就是没有
print(ret)
print("我" in s) # in可以做条件上的判断
print("我" not in s)
# 判断
name = input("输入你的名字")
# 判断你是不是姓张
if name.startswith("李"): # 判断字符串是否以KXXXX开头,endwith()
print("你姓李")
else:
print("不姓李")
money = input("请输入你的钱")
if money.isdigit(): #判断字符串是否由整数组成,
money = int(money)
print("可以花钱了")
else:
print("对不起,你输入有误")
6.补充和总结
# 补充和总结
s = "hello"
print(len(s)) #length长度
#join()
s = "python_java_c_javascript"
lst = s.split("_")
print(lst)
lst = ["小黄","小楠","小李"]
# 用_把上面的人名连起来
s="_".join(lst)
print(s)
# 总结
"""
1.f“{变量}"格式化一个字符串
2.索引和切片:
索引:从0开始的.[]
切片:s[start:end:step],end位置的数据永远拿不到
3.相关操作:
字符串操作对原字符串是不发生改变的,
1.upper()在需要忽略大小写的时候
2.strip()可以去掉字符串左右两端的空白(空格,\t,\n)
3.replace()字符串替换
4.split()对字符串进行切割
5.join()拼接一个列表中的内容成为新字符串
6.startswith()判断字符串是否以xxx开头
7.1en()字符串长度(内置函数)
字符串的循环和遍历
for c in s:
print(c)
字符串中的每一个字符
关于in:
1.判断xxx是否在xxxx中出现了
2.for循环
"""
三.列表
1.列表的概念
# 定义:能装东西的东西
# 在oython中用[]来表示一个列表,列表中的元素通过,隔开
a = ["小黄", "小蓝", "小紫", [1, 2, "小灰", True]]
# 特性:
# 1.也像字符串一样也有索引和切片
# 2.索引如果超过范围会报错
# 3.可以用for循环进行遍历
# 4.用len拿到列表的长度
lst = ["小黄", "小蓝", "小紫", "小红"]
print(lst[0])
print(lst[1:3])
print(lst[::-1])
print(lst[33656])
for item in lst:
print(item)
print(len(lst))
2.增删改查
# 列表的增删改查
lst = []
# 向列表中添加内容
lst.append("小黄")
lst.append("小岚")
lst.append("小仔")
# insert()插入
lst.insert(0, "小黑")
# extend()可以合并两个列表
lst.extend(["曹操", "刘备", "关羽"])
print(lst)
# 删除
ret = lst.pop(3) # 给出被删除的索引,返回被删除的元素
print(lst)
print(ret)
lst.remove("小岚") # 删除某个元素
print(lst)
# 修改
lst[3] = "小希"
print(lst)
# 查询
print(lst[3]) # 直接用索引进行查询操作
# 其他操作
# 排序
lst = [1, 2, 3, "小黄", "Lee"] # 列表会按照你存放的顺序来保存
print(lst)
lst = [132, 156, 654, 3216, 654, 6872, 6843, 7489]
lst.sort() # 对列表进行升序排序
lst.sort(reverse=True) # reverse: 翻转
print(lst)
# 列表的嵌套
lst = ["abc", "def", ["123", "456", ["ghi", "lee", 789], 7]]
print(lst[2][2][0])
lst[2][2][1] = lst[2][2][1].upper()
print(lst)
# 列表的循环删除
lst = ["小黄", "小蓝", "小紫", "小红", "Lee"]
for item in lst:
if item.startswith("小"):
lst.remove(item)
print(lst) # 这样删除会删不干净,因为在删除一个元素后,会补上来一个元素
lst = ["小黄", "小蓝", "小紫", "小红", "Lee"]
temp = [] # 准备一个临时列表,负责存储要删除的内容
for item in lst:
if item.startswith("小"):
temp.append(item) # 把要删除的内容记录下来
for item in temp:
lst.remove(item) # 去原列表中进行删除操作
print(lst)
# 安全稳妥的循环删除方式:
# 将要删除的内容保存在一个新列表中,循环新列表,删除老列表
四.元组
# tuple元组,特点:不可变的列表
t = ["小黄", "小李", "小岚"]
print(t)
print(t[1:3])
t[0] = "小楠" # 'tuple' object does not support item assignment
print(t)
# 你固定了某些数据,不允许外界修改
# 元组如果只有1个元素
t=("小红")
print(t)
print(type(t)) #<class 'str'>
#关于元组的不可变(坑)
t=(1,2,3,["小岚","小吕"])
t[3].append("小黄")
print(t) #(1, 2, 3, ['小岚', '小吕', '小黄'])
五.Set
# set集合,set集合是无序的
s = {1, 2, "小黑子", 3}
print(type(s))
print(s)
s = {1, 2, 3, "油饼食不食", []} # unhashable type: 'list'
print(s)
# 不可哈希:python中的set集合进行数据存储的时候.需要对数据进行哈希计算,根据计算出来的哈希值进行存储数据
# set集合要求存储的数据必须是可以进行哈希计算的,
# 可变的数据类型,list,dict,set
# 可哈希:不可变的数据类型,int,str,tuple,bool
s = set() # 创建空集合
s.add("一个真正的鳗")
s.add("小黑子")
s.add("ikun")
print(s)
s.pop() # 由于集合无序,测试的时候没法验证是最后一个,
print(s)
s.remove("小黑子")
print(s)
# 热想要修改,先删除,再新增
s.remove("小黑子")
s.add("我家哥哥")
print(s)
for item in s:
print(item)
# 交集,并集,差集
s1 = {"哥哥", "下蛋", "一个真正的鳗"}
s2 = {"ikun", "小黑子", "哥哥"}
print(s1 & s2) # 交集
print(s1.intersection(s2))
print(s1 | s2) # 并集
print(s1.union(s2))
print(s1 - s2) # 差集
print(s1.difference(s2))
# 重要的作用:可以去除重复
s1 = {"周杰伦", "昆凌", "蔡依林", "侯佩岑"}
print(s1)
s1.add("周杰伦")
print(s1)
lst = ["周杰伦", "昆凌", "蔡依林", "侯佩岑", "周杰伦", "昆凌", "蔡依林", "侯佩岑", "周杰伦", "昆凌", "蔡依林", "侯佩岑"]
print(lst)
print(set(lst))
print(list(set(lst))) # 去除重复之后的数据是无序的。
使用set集合去重的操作
baseRes = []
needRes = []
# FunList .append('a') #可添加值
baseRes = ['/XiuRen/12286.html', '/XiuRen/12286_1.html', '/XiuRen/12286_2.html', '/XiuRen/12286_3.html', '/XiuRen/12286_4.html', '/XiuRen/12286_5.html', '/XiuRen/12286_6.html', '/XiuRen/12286_7.html', '/XiuRen/12286_8.html', '/XiuRen/12286_9.html', '/XiuRen/12286_10.html', '/XiuRen/12286_11.html', '/XiuRen/12286_12.html', '/XiuRen/12286_13.html', '/XiuRen/12286_14.html', '/XiuRen/12286_15.html', '/XiuRen/12286_16.html', '/XiuRen/12286_17.html', '/XiuRen/12286_18.html', '/XiuRen/12286_19.html', '/XiuRen/12286_20.html', '/XiuRen/12286_21.html', '/XiuRen/12286_22.html', '/XiuRen/12286_23.html', '/XiuRen/12286_24.html', '/XiuRen/12286_25.html', '/XiuRen/12286_26.html', '/XiuRen/12286_27.html', '/XiuRen/12286_28.html', '/XiuRen/12286_29.html', '/XiuRen/12286_1.html', '/XiuRen/12286.html', '/XiuRen/12286_1.html', '/XiuRen/12286_2.html', '/XiuRen/12286_3.html', '/XiuRen/12286_4.html', '/XiuRen/12286_5.html', '/XiuRen/12286_6.html', '/XiuRen/12286_7.html', '/XiuRen/12286_8.html', '/XiuRen/12286_9.html', '/XiuRen/12286_10.html', '/XiuRen/12286_11.html', '/XiuRen/12286_12.html', '/XiuRen/12286_13.html', '/XiuRen/12286_14.html', '/XiuRen/12286_15.html', '/XiuRen/12286_16.html', '/XiuRen/12286_17.html', '/XiuRen/12286_18.html', '/XiuRen/12286_19.html', '/XiuRen/12286_20.html', '/XiuRen/12286_21.html', '/XiuRen/12286_22.html', '/XiuRen/12286_23.html', '/XiuRen/12286_24.html', '/XiuRen/12286_25.html', '/XiuRen/12286_26.html', '/XiuRen/12286_27.html', '/XiuRen/12286_28.html', '/XiuRen/12286_29.html', '/XiuRen/12286_1.html'] #可是预先设置
print(baseRes)
needRes= list(set(baseRes ))
print(needRes) #不重复但是乱序
needRes.sort(key=baseRes .index)
print(needRes) #不重复且按原序
六.字典
1.概念
# 首先,字典是以键值对的形式进行存储数据的
# 字典的表示方式:{key:value,key2:value,key3:value}
dic = {"jay": "周杰伦", "鸡哥": "蔡徐坤"}
val = dic["jay"]
print(val)
# 字典的key必须是可哈希的数据类型
# 字典的value可以是任何数据类型
dic = {[]: 123}
print(dic) # unhashable type: 'list'
dic={"ikun":["小黑子1号","小黑子2号"]}
2.增删改查
dic = dict()
dic["ikun"] = "小黄"
dic[1] = "123"
dic["ikun"] = "Lee" # 覆盖前面的元素
print(dic)
dic.setdefault("湖南", "臭豆腐") # 设置默认值.如果以前已经有了湖南了,setdefault就不起作用了
dic.setdefault("湖南", "胡辣汤")
print(dic)
# 删除
dic.pop("jay") # 根据key去删除
print(dic)
# 查询
print(dic["jay"])
print(dic.get('jay'))
print(dic["jay10086"]) # 如果key不存在,程序会报错. 当你确定你的key是没问题的,可以用
print(dic.get('jay10086')) # 如果key不存在,程序返回None. 程序返回None.当不确定你的key的时候,可以用
# None
a = None # 单纯的就是空,表示没有的意思
print(type(a))
# 小案例
dic = {
"小黑子1号": "油饼食不食",
"小黑子2号": "香精煎鱼",
"小黑子3号": "我家哥哥下蛋你别吃",
"小黑子4号": "一个真正的鳗",
"小黑子5号": "香翅捞饭食不食"
}
name = input("输入你想看的小黑子话")
val = dic.get(name)
if val is None:
print("你不是我们ikun的一员")
else:
print(val)
3.循环和嵌套
- 循环
dic = {
"小黑子1号": "油饼食不食",
"小黑子2号": "香精煎鱼",
"小黑子3号": "我家哥哥下蛋你别吃",
"小黑子4号": "一个真正的鳗",
"小黑子5号": "香翅捞饭食不食"
}
# 1.可以用for循环,直接拿到key
for key in dic:
print(key, dic[key])
# 2.希望把所有的ky全都保存在一个列表中
print(list(dic.keys())) # 拿到所有的key了
# 3.希望吧所有的value都放在一个列表中
print(list(dic.values()))
# 4.直接拿到字典中的key和value
print(dic.items())
for key,val in dic.items(): #可以拿到所有的key 和 val
# key = item[0]
# val = item[1]
# print(key, val)
#key,val = item
print(key,val)
a, b = (1, 2) # 元组或者列表都可以执行该操作,该操作被称为解构(解包)
print(a)
print(b)
- 嵌套
ikun = {
"name": "小黄",
"age": 20,
"quotes": {
"quote1": "油饼食不食",
"quote2": "香精煎鱼",
"hobby": {
"be1": "唱",
"be2": "跳",
"be3": "rap"
}
},
"behave": [
{"行为1": "唱", "哥哥1": "鲲鲲"},
{"行为2": "跳", "哥哥2": "下蛋"},
{"行为3": "rap", "哥哥3": "篮球"}
]
}
# 小黄语录的爱好的行为1
be1 = ikun["quotes"]["hobby"]["be1"]
print(be1)
# 小黄语录的爱好be2改为篮球
ikun["quotes"]["hobby"]["be2"] = "篮球"
print(ikun)
dic = {
"1号小黑子": "油饼食不食",
"2号小黑子": "香精煎鱼",
"3号小黑子": "我家哥哥下蛋你别吃",
"4号小黑子": "一个真正的鳗",
"5号小黑子": "香翅捞饭食不食"
}
temp = [] # 存放即将要别除的key
for key in dic:
if key.startswith("1"):
temp.append(key) #dictionary changed size during iteration
for t in temp: #循环列表,删除字典中的内容
dic.pop(t)
print(dic)