张同学python上课笔记
全部知识点思维导图
https://www.processon.com/view/link/5f1cfed21e08533a6285ffcf
第一节课
引入库
import 库名 as 别名
turtle库常见操作
turtle.forward(distance) 画笔向前移动distance距离
turtle.backforward(distance) 画笔向后移动distance距离
turtle.right(degree) 绘制方向向右旋转degree度
turtle.left(degree) 绘制方向向左旋转degree度
turtle.penup() 抬起画笔,之后移动画笔不绘制形状
turtle.pendown() 落下画笔,之后移动画笔绘制形状
turtle.pensize() 设置画笔宽度
turtle.circle(radius,degree) 画弧度(圆) 参数:半径 角度
turtle.goto()转移坐标
turtle.pencolor() 设置画笔颜色,常用颜色{white,black,grey,dark,green,gold,violet,purple}
新增 填充颜色
fillcolor() #设置填充的颜色 ‘red’ ‘green’ 'yellow’等
begin_fill() #开始填充的起点
en_fill() #结束填充点
第二节课
循环语句for
for 变量 in 序列:xxxxxx
- 方法举例
#画一个正方形
for i in range(4):#这里的代码会重复4次t.forward(100)t.left(90)
range函数
range(start, end,step)
3个参数
- 参数1: 开头(省略的话 默认0开始)
- 参数2: 结尾 (不包含结尾)
- 参数3: 步长
list(range(4)) #[0,1,2,3]list(range(0,4)) #[0,1,2,3]list(range(1,4)) #[1,2,3]list(range(0,4,2)) #[0,2]
变量
存储值的东西
变量的赋值
名字 = 值
number = 10
name = ‘zzj'
变量的类型
type()函数可以查看变量的类型
1. 数字
- 整数(int)
- 浮点数(float)
- 复数
2. 字符串 str
- 必须用引号括起来
3.列表 list
- 由[]括起来
- 用,来分割
- 值可以其他值
list=[1,”b",[2,"F"]]
4.元组 tuple
5.字典 dict
第三节课
输入与输出
#输出print()#输入input("提示的字符串")
列表的操作
list=[10,20,30,40,50,60]
fruits=['apple','pear','peach','banana']# 注意点 从0开始#列表的取值
list[2] #30#列表的增加
fruits.append("a") #['apple', 'pear', 'peach', 'banana', 'a']#列表的截取
list[2:4] #[30,40]
fruits[1:4] #['pear', 'peach', 'banana']
字符串的操作
str="abcdefg一二三四五六"str1="你好!"
str2="很高兴认识你"#字符串的取值
str[1] #b#字符串的截取
str2[1:3] #高兴#字符串的合并链接
print(str1+str2) #你好!很高兴认识你
for循环补充
# for 变量 in 序列:
#
# 序列:
# 1. range()
# 2. list
# 3.strfor i in range(4):print(i)
#0 1 2 3for i in [11,22,33]:print(i)
#11 22 33for i in "abcdefg":print(i)
#a b c d e f g
类型变换
- str转变为int
- int()
- int转变为str
- str()
第四-五节课
if语句
if 语句
no_ic=True #有没有身份证if no_ic:print("办证明")print("坐飞机")
if-else语句
age = int(input("age:"))if age>=18:# 条件成立的时候执行这里print("开车")
else:# 条件不成立的时候执行这里print("骑自行车")
if-elif-else语句
score=int(input('请输入成绩')) #成绩
if score>=90:print('A')
elif score>=80:print('B')
elif score>=60:print('C')
else:print('D')
常量 布尔值
True #z真
False #假
比较符
比较符 | 含义 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
if语句 嵌套
score = int(input("score:"))if score>90:print("A")
else:if score>=80:print("B")else:if score>=60:print("C")else:print("D")
第六节课 流程控制语句总结
流程控制语句
1. 顺序语句 (默认)
2. 分支语句 (if)
3. 循环语句
continue break
for循环语句
while循环语句
strin = ""while strin!="我很菜":strin=input("说'我很菜'我才放过你:")
while True:strin=input("请说我很菜:")if strin=='我很菜':breakelse:print('打你')
for | while |
---|---|
适合循环次数固定的 | 条件判断,适合循环次数不固定的 |
随机整数的生成
import randomrandom.randint(0,10)# 范围
循环语句补充
break
跳出循环
import randomnum=random.randint(0,100)
print(num)for i in range(3):numb=int(input("请输入数字"))if numb==num:print("正确")breakelse:if numb>num:print("太大了")else:print('太小了')
continue
跳过剩下的语句,重新循环
import random# 输入-1 的时候 跳过num=random.randint(0,100)
print(num)for i in range(3):numb=int(input("请输入数字"))if numb== -1:continueprint("aaa")if numb==num:print("正确")breakelse:if numb>num:print("太大了")else:print('太小了')
第七节课
格式化字符串
1. %号操作符
print("%d * %d = %d "%(i,j,i*j))
操作符 | 类型 |
---|---|
%d | 整数 |
%s | 字符串 |
%u | 无符号整数(自然数) |
%f | 浮点数 (小数) |
2. format()函数
print("{} * {} = {} ".format(i,j,i*j),end="")
print函数不换行
print"",end="")print(" 1 2 ") # end="\n" ==> "1 2"+"\n" = "1 2 \n"
print(" 1 2 ",end="") # "1 2"+"" = "1 2"
对比
%操作符 | format()函数 | |
---|---|---|
占位符 | %d %s %e | {} |
分配值 | %() | .format() |
打印九九乘法表
for i in range(1,10):for j in range(1,i+1):print("",end="") #不换行print()# 换行
第八节课
字符串
str1='我是字符串1' #单引号
str2="字符串2" #双引号str3='''君不见黄河之水天上来
'''# in 进行判断
print('串2' in str2)# not in 判断
print('是' not in str1)# + 号进行字符串拼接
print(str1+str2) #我是字符串1字符串2# * 复制
print(str1*3) #我是字符串1我是字符串1我是字符串1# len()得到长度
print(len(str1)) #6
列表
定义
[ ]
包围,
分隔
获取信息
- 长度
len()
- 取其中的值
list[ i]
操作
- 增加
.append()
- 删除
.remove()
- 修改
list[i] = newValue
英雄管理系统
# 1.如何表达集合? 列表
heros = ["孙悟空","赵云","曜","狂铁"]while True:print("================英雄管理系统================")# 2.显示英雄数量 len()print(" 共计%d位英雄" % (len(heros)))# 2.显示所有的英雄for i in range(len(heros)):print("%d: %s " % (i,heros[i]), end="")print()# 操作码opt = input('''
请选择你要的操作:a: 增加一个英雄d: 删除一个英雄e: 修改一个英雄q: 退出''')if opt == 'a':# 获得增加英雄hero=input("输入你想增加的英雄:")# 3.使用append函数增加heros.append(hero)elif opt == 'd':# 获得要删除英雄hero=input("输入你想删除的英雄:")# 4.使用remove函数删除heros.remove(hero)elif opt == 'e':# 获得要修改的英雄序号index=int(input("请输入要修改英雄的序号:"))name=input("请输入要修改后的名字:")# 5.修改heros[index]=nameelif opt == 'q':break
第九课
列表的高级操作方法
sort()
进行排序- 默认升序
- sort( reverse=True) 降序
- 字符串也可以排序 按照ASCII表的顺序
reverse()
将列表进行反转index()
查看列表元素的下标count()
统计元素的 个数
h=[165,176,189,156,155,165,167]
c=['b',"abc",'s',"ddd","A","A","A"]
f=['apple','banana','orange','pear']str="abcdefa"# sort函数排序
# h.sort() #数据进行 升序
# h.sort(reverse=True) # 降序
# c.sort() #字符串也可以排序 按照ASCII表# reverse函数反转
h.reverse()# index 查看元素在列表中的序号(下标)
print(f.index("apple"))# count 函数 查看里面元素的个数
print(c.count("A"))
元组
tuple
元组 | 列表 | |
---|---|---|
定义 | (, ) | [ , ] |
append() | 不支持 | 支持 |
remove() | 不支持 | 支持 |
修改 | 不支持 | 支持 |
下标查看 | 支持 | 支持 |
len() | 支持 | 支持 |
切片 | 支持 | 支持 |
- 元组和列表很类似
- 但是元组只可查看不可修改
- 列表->元组 tuple()
- 元组-> 列表 list()
第十课
字典
dict
定义
- {} 包围
- 元素用 , 分隔
- 元素 key:value
修改
通过键进行修改
增加
通过键进行增加
删除
- 删除单独元素
- 清空
- 删除整个
# 字典的定义
luna = {"name":"luna", # key : value"gender":"woman","job":"fashi","place":"daye","zhandouli":2000
}print(type(luna))# 访问 通过 key
print(luna["job"])
print(luna.get("a"))# 修改 通过 key
luna["job"]="zhanshi"print(luna["job"])# 增加
luna["defence"]=200print(luna)# 删除
# 删除一个条目
del luna["job"]# 删除所有条目
luna.clear()print(luna)# 直接删除整个
del lunaprint(luna)
键的要求
- 只能出现一次,出现多次按照最后的为准
- 不能改变,只能用数字,字符串,元组 不能用列表
字典的常用函数
dict.get(key)
范围字典key对应的值,不存在则返回Nonedict.setdefault(key)
范围字典key对应的值,不存在则返回None并添加到字典里dict.keys()
返回所有的keydict.value()
返回所有的valuedict.items()
以元祖列表的形式返回 Key与Value
随机选择
import random
key=random.choice(list(dict.keys()))# 随机选择一个key(英文)
第十一节课
函数
函数定义
- 必需
- def
- 函数名
- 函数主体
- 非必需
- 参数
- return 返回值
def 函数名字(参数[默认参数]):# 函数的主体return 返回值
函数使用
- 与函数定义在同一文件
函数名字(参数) #没有返回值
x = 函数名字(参数)
- 不同文件
import 函数定义所在文件文件名.函数名(参数)
例子
# 定义函数
def abc(n,d):import turtleturtle.pendown()for i in range(n):turtle.forward(d)turtle.left(360 / n)turtle.penup()turtle.done()# 本文件使用
abc(7,100)
默认参数
- 在函数定义的时候指定一个默认值
- 调用函数时候 可以不指定 自动的使用默认值
def guessGame(start=0,end=100):import randomnum=random.randint(start,end)while True:user_guss=int(input("请输入数字:"))if num==user_guss:print("恭喜")breakelif user_guss>num:print("太大了")else:print("太小了")# guessGame()
guessGame(start=-100,end=100)
第十一节课
import randomdict={"apple":"苹果","orange":"橘子","banana":"香蕉"}def EtoC():while len(dict)!=0:key=random.choice(list(dict.keys()))print("请说出{}的中文意思:".format(key))abc=input()if abc==dict[key]:print("恭喜回答正确!")del dict[key]else:print("答错了,正确意思为{}".format(dict[key]))def CtoE():while len(dict)!=0:key=random.choice(list(dict.keys()))print("请说出{}的英文意思:".format(dict[key]))abc=input()if abc==key:print("恭喜回答正确!")del dict[key]else:print("答错了,正确意思为{}".format(key))if __name__== "__main__":opt=int(input('''
请选择模式:1.英文记中文2.中文记英文'''))if opt==1:EtoC()elif opt==2:CtoE()
第十三节课——递归
汉诺塔游戏
def hanoi(n,x,y,z):'''汉诺塔:param n: 盘子数:param x: from 柱:param y: by 柱:param z: to 柱'''if n ==1:print(x,"-->",z)else:hanoi(n-1,x,z,y)print(x,"-->",z)hanoi(n-1,y,x,z)hanoi(4,'a','b','c')
阶乘
def fact(n):if n==1:return 1else:return fact(n-1)*nprint(fact(3)) # 6
面向对象编程
class student():# =============属性 =============# 使用变量来描述name=Nonescore_h=Nonescore_m=None#==============方法===============# 第一个参数必须是self# 必备 实例化的时候使用 对象实例化的时候会自动调用def __init__(self,name,score_h,score_m):self.name=nameself.score_h=score_hself.score_m=score_m#其他def set_score_h(self,score):'''更新历史成绩'''self.score_h=scoredef set_score_m(self,score):'''更新数学成绩'''self.score_m=scoredef printsocre(self):print("{} 的 历史成绩{} 数学成绩{}".format(self.name,self.score_h,self.score_m))if __name__ == '__main__':zhangsang = student("张三",90,98)zhangsang.printsocre()zhangsang.set_score_h(45)zhangsang.printsocre()
对象继承
# 父类
class person():def __init__(self,name,age):self.name=nameself.age=agedef eat(self):print("eating...")# 子类
class student(person):# 子类会继承父类的所有属性与方法def __init__(self,name,age,score):# 先初始化父类的属性super(student,self).__init__(name,age)# 再初始化子类的属性self.score=score# 定义子类的动作def tell(self):print("score:{}".format(self.score))if __name__ == '__main__':zhans = student("张三",18,99)zhans.tell() # 子类的方法zhans.eat() # 父类的方法
类的重载
class Animal():# 父类 动物def run(self):# 所有动物都会动 但是各自动的方式不一样print("Animal is running...")class Dog(Animal):def run(self):# 子类需要根据实际情况 改变一下print("Dog is running...")if __name__ == '__main__':xiaohuan=Dog()xiaohuan.run()
类的多态
实例化后的对象可以作为参数传入函数中
基于重载
这样 不同类别的对象做相同的动作 结果可能不一样
class Animal:# 如果类不继承可以不加括号# 父类 动物def run(self):# 所有动物都会动 但是各自动的方式不一样print("Animal is running...")class Dog(Animal):def run(self):# 子类需要根据实际情况 改变一下print("Dog is running...")def moving(cls):# 不属于任何类 独立的一个函数# 是对21-22行的内容总结cls.run()if __name__ == '__main__':# Animal().run()# Dog().run()# 类的实例化 =》将虚拟的东西变成实际的东西moving(Dog())
班级
from 定义的文件名 import student,teacher
import randomclass Class:name=Noneteachers=[]students=[]def __init__(self,name):self.name=namedef addStudent(self,student):self.students.append(student)def addTeacher(self,teacher):self.teachers.append(teacher)def haveAClass(self):teacher=random.choice(self.teachers)teacher.teaching()for stu in self.students:stu.learning()def haveAMeeting(self):teacher = random.choice(self.teachers)teacher.holding()for stu in self.students:stu.listening()def haveAclear(self):events=["扫地","擦黑板","擦窗子","倒垃圾"]for stu in self.students:stu.cleaning(random.choice(events))if __name__ == '__main__':teacher1=teacher("女","张老师","历史")teacher2=teacher("男","李老师","数学")teacher3=teacher("男","王老师","英语")student1=student('男',"张一",99,(1,1),0)student2=student('男',"孙悟空",90,(1,2),1)student3=student('女',"花木兰",99,(2,1),2)student4=student('男',"恺",99,(2,2),3)yiban=Class("一班")yiban.addTeacher(teacher1)yiban.addTeacher(teacher2)yiban.addTeacher(teacher3)yiban.addStudent(student1)yiban.addStudent(student2)yiban.addStudent(student3)yiban.addStudent(student4)yiban.haveAClass()print("="*100)yiban.haveAclear()print("=" * 100)yiban.haveAMeeting()
GUI图形界面
from tkinter import *class GUIcalc:def __init__(self):root=Tk() #创建主窗口root.title("计算器")# root.geometry("300x400")# 框架1frame1 = Frame(root)# 在框架1里面创建两个单行文本框 并放置在框架Entry(frame1).grid(row=0,column=0,columnspan=4)Entry(frame1).grid(row=1,column=0,columnspan=4)# 把框架1 放在主窗口里 frame1.pack(side=TOP,expand=YES)#frame2 = Frame(root)# 按钮的文字 按钮的宽度Button(frame2,text="C",width=4).grid(row=1,column=0)Button(frame2,text="1").grid(row=1,column=1)frame2.pack(side=BOTTOM)root.mainloop()if __name__ == '__main__':calc=GUIcalc()
from tkinter import *
from cal import calclass GUICal:def __init__(self):self.root = Tk()self.root.title(" 计算器")self.root.maxsize(200, 300)# 要显示的文字self.showText=StringVar()self.resultText=StringVar()self.showText.set("")self.resultText.set("")# 逻辑层self.cal=cal()self.EntryFrame()self.ButtonFrame()def clearHandler(self):# clear的处理函数(text1,text2)=self.cal.clear()self.showText.set(text1)self.resultText.set(text2)def recordHandler(self,record):(text1,text2)=self.cal.record(record)self.showText.set(text1)self.resultText.set(text2)def percentHandler(self):(text1, text2) = self.cal.percent()self.showText.set(text1)self.resultText.set(text2)def equalHandler(self):(text1, text2) = self.cal.equal()self.showText.set(text1)self.resultText.set(text2)def ButtonFrame(self):fm2 = Frame(self.root)Button(fm2, text="C", width=8, bg="orange",command=lambda :self.clearHandler()).grid(row=1, column=0, columnspan=2)Button(fm2, text="%",command=lambda :self.percentHandler()).grid(row=1, column=2)Button(fm2, text="/",command=lambda:self.recordHandler("/")).grid(row=1, column=3)Button(fm2, text="7",command=lambda:self.recordHandler("7")).grid(row=2, column=0)Button(fm2, text="8",command=lambda:self.recordHandler("8")).grid(row=2, column=1)Button(fm2, text="9",command=lambda:self.recordHandler("9")).grid(row=2, column=2)Button(fm2, text="*",command=lambda:self.recordHandler("*")).grid(row=2, column=3)Button(fm2, text="4",command=lambda:self.recordHandler("4")).grid(row=3, column=0)Button(fm2, text="5",command=lambda:self.recordHandler("5")).grid(row=3, column=1)Button(fm2, text=" 6",command=lambda:self.recordHandler("6")).grid(row=3, column=2)Button(fm2, text=" -",command=lambda:self.recordHandler("-")).grid(row=3, column=3)Button(fm2, text=" 1",command=lambda:self.recordHandler("1")).grid(row=4, column=0)Button(fm2, text=" 2",command=lambda:self.recordHandler("2")).grid(row=4, column=1)Button(fm2, text=" 3",command=lambda:self.recordHandler("3")).grid(row=4, column=2)Button(fm2, text=" +",command=lambda:self.recordHandler("+")).grid(row=4, column=3)Button(fm2, text=" 0", width=5,command=lambda:self.recordHandler("0")).grid(row=5, column=0, columnspan=2)Button(fm2, text=" .", bg='orange',command=lambda:self.recordHandler(".")).grid(row=5, column=2)Button(fm2, text=" =", bg="#3CA0D0",command=lambda :self.equalHandler()).grid(row=5, column=3)fm2.pack(side=BOTTOM)def EntryFrame(self):fm1 = Frame(self.root)Entry(fm1,textvariable=self.showText).grid(row=0, column=0, columnspan=4)Entry(fm1, background="#eee",textvariable=self.resultText).grid(row=1, column=0, columnspan=4)fm1.pack(side=TOP, expand=YES)def start(self):self.root.mainloop()t = GUICal()
t.start()
class cal:symbol=["+","-","*","/"]def __init__(self):self.showText=""self.resultText=""def clear(self):'''c 按钮的功能,清除所有'''self.showText=""self.resultText=""return (self.showText,self.resultText)def record(self,new):''' 记录按钮按下的值 '''self.showText=self.showText+newreturn (self.showText,self.resultText)def percent(self):'''按下百分比按键'''pos=0if self.showText[-1] in self.symbol:return (self.showText, self.resultText)for i in range(len(self.showText)-1,-1,-1):# 倒序遍历if self.showText[i] in self.symbol:pos=i# 记录符号的位置break# 后半部分除以100num=float(self.showText[pos:]) / 100#前半部分fore=self.showText[0:pos+1] if pos>0 else ""#重新组合起来self.showText=fore+str(num)return (self.showText, self.resultText)def equal(self):# self.showtext 1+0.56try:# 有可能出错的语句# eval 把字符串表达式 运行 返回结果rst=eval(self.showText)except:# 如果出错就会运行这一个rst="Error"self.resultText=rstself.showText=""return (self.showText, self.resultText)
t=cal()
# t.showText="+-*"
# t.equal()
- Button 的command属性:按钮被按下执行的操作
- lambda函数: 匿名函数 只有一行表达式 :前是参数 :后是一个操作
- try:expect:: 可能出错的语句放在try里 那么如果出错程序不会停止 会执行expect里面的语句
- eval函数:将字符串当作代码执行得到结果
- 选择赋值: x= value1 if condition else value2 如果条件成立 x=value1 否则x=value2
pyinstaller 打包
常用参数
- -F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
- -D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
- -a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
- -d, –debug 产生debug版本的可执行文件
- -w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
- -c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)pyinstaller -c xxxx.pypyinstaller xxxx.py --console
- -o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
- -p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
- –icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py
- -n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字
python 爬虫
网页的结构
HTML参考教程
<!DOCTYPE html> <!-- 文件类型 --><html><!-- 文件的内容 -->
<head><!-- 一些头部信息 --><meta charset="UTF-8"> <!-- 元元素 字符集 --><title>Title</title> <!-- 头部标题 --><!-- 2. CSS 样式表 集中起来 --><style>h1{color: red;}.even{color: green;}#t{background-color: yellow;}</style>
</head>
<body><!-- 主体内容 --><h1>字体最大的标题</h1><h2>字号次之的标题</h2><p class="even">我是段落0</p><p class="odd">我是段落1</p><p class="even" id="t">我是段落2</p><p class="odd">我是段落3</p><p class="even">我是段落4</p><p class="odd">我是段落5</p><a href="http://www.baidu.com">www.sougou.com</a><!-- 1. 内联 css 也就是把样式写在标签里面--><img height="100px" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1583158442623&di=d7516bcfb785a9ed3b20a0b71416a4ba&imgtype=0&src=http%3A%2F%2Fimg.itmop.com%2Fupload%2F2018-2%2F2018226116238561.png">
</body>
</html>
网页下载
- 工具 requests库
- 参考文章
- requests 教程1
- requests 教程2
import requestsurl="https://baidu.com"
url2="https://cn.bing.com/search"
url3="http://httpbin.org/post"#参数
params={"q":"python"
}#data
data={"username":"Tom","password":"1234"
}# 请求
res=requests.get(url)
#res=requests.get(url2,params)
#res=requests.post(url3,data)# 状态码
print(res.status_code)
# 源代码
print(res.text)
# 内容
print(res.content)
# URL 拼接后的 实际请求URL
print(res.url)# 保存到文件
with open("baidu.txt","w") as f:f.write(str(res.content))
网页解析
- 工具: beautifulsoup库
- 参考教程 bs4中文文档
from bs4 import BeautifulSouphtml_doc = """
<html><head><title>The Dormouse's story</title></head>
<body><p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p>
"""# html->soup
soup = BeautifulSoup(html_doc,"html.parser")#
# # tag
# print(soup.title)
# print(soup.p)
#
# # name
# print(soup.title.name)
#
# # Attributes
# print(soup.p.attrs)print(soup.head.title)
print(soup.body.p)# contents
print(soup.body.contents)
# chidren
for child in soup.body.children:print(child)# find()
print(soup.body.find('a'))
# find_all()
print(soup.body.find_all('a'))
import requests
from bs4 import BeautifulSoupurl="https://book.douban.com/tag/"
myheaders={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}# GET POST
res=requests.get(url,headers=myheaders)a_list=[]
# response
if res.status_code ==200:html_code=res.textsoup=BeautifulSoup(html_code,'html.parser')table=soup.find('table',{'class':"tagCol"})for a in table.find_all('a'):a_list.append(a.attrs['href'])print(a_list)
else:print(res.reason)
存储文件
import requests
from bs4 import BeautifulSoup
import remyheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}def download(url):# 请求HTML网页源码res = requests.get(url, headers=myheaders)# 请求成功if res.status_code == 200:# HTML-->页面解析器soup = BeautifulSoup(res.text, 'html.parser')return soupelse:print("请求失败 {}".format(res.status_code))return Nonedef get_all_book_link(soup, fileName=None):''' 获得所有书的详情链接'''# 找到 ul class="subject-list"lis = soup.find_all('li', {"class": "subject-item"})# 遍历清洗出链接rst = []for li in lis:rst.append(li.find('a').attrs['href'])# 保存if fileName != None:with open(fileName, 'w') as f:f.write(','.join(rst))f.close()return rstdef get_book_detail(url):'''获得书籍的详细信息'''soup = download(url)if soup != None:name = soup.find('span', {"property": "v:itemreviewed"}).stringrate = soup.find('strong', {"class": "ll rating_num"}).stringinfo = soup.find('div',{'id':"info"}).get_text()# print(info)info_list = info.replace(" ","").split("\n")press = info_list[6][4:]year = info_list[15][4:]# price=return (name, rate,press,year)def output(books):'''通过HTML 表格的方式 输出结果'''with open("output.html",'w') as f:f.write("<html>\n")f.write("<body>\n")f.write("<table border='1'>\n")for book in books:f.write("<tr>\n")for item in book:f.write("<td> {} </td>\n".format(item))f.write("</tr>\n")f.write("</table>\n")f.write("</body>\n")f.write("</html>\n")f.close()def craw_book(url):# 下载并转化为soupsoup = download(url)if soup != None:# 获得所有书的详情链接urls = get_all_book_link(soup, fileName="urls.txt")books = []for url in urls[:10]:print("crawing {}".format(url))books.append(get_book_detail(url))print(books)output(books)if __name__ == '__main__':url = "https://book.douban.com/tag/%E4%B8%9C%E9%87%8E%E5%9C%AD%E5%90%BE"craw_book(url)
csv模块参考教程
- 官方中文文档
- csv例子
HTML教程
- w3cHTML教程
正则表达式
- python 正则教程
- 正则表达式
python标准库
OS库
- 参考教程
- 官方模板
import osfor path in os.listdir(".\dir1"):c_path=os.path.join(".\dir1",path)if os.path.isfile(c_path):print(os.path.abspath(c_path))
time库
- 参考教程
import time
# 返回 时间戳 秒 当前的时间距离1970年1月0日0分0秒的秒数
print(time.time())# 返回 时间元组 默认是当前时间
print(time.localtime())
print(time.localtime(2000000000))# 将时间元组(默认当前时间) 转化为 固定时间格式字符串
print(time.asctime()) #Wed Mar 18 19:11:38 2020
print(time.asctime(time.localtime(2000000000))) #Wed May 18 11:33:20 2033# 将时间戳(默认当前时间) 转化为 固定时间格式字符串
print(time.ctime()) #Wed Mar 18 19:11:38 2020
print(time.ctime(2000000000)) #Wed May 18 11:33:20 2033# 将时间元组(默认当前时间) 转化为 自定义时间格式字符串
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 2020-03-18 19:20:41
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(2000000000))) ## 自定义时间格式字符串 转化为 将时间元组
print(time.strptime("2020-03-18 19:20:41","%Y-%m-%d %H:%M:%S"))
calendar库
import calendar# 返回一年的年历
print(calendar.calendar(2020))# 返回一个月的月历
print(calendar.month(2020,3))# 返回一个月的月历 通过列表的方式
print(calendar.monthcalendar(2020,3))# 判断是不是闰年
print(calendar.isleap(2020))# 返回日期的星期数
print(calendar.weekday(2020,3,18))
datetime库
类
- date类 日期
- time类 时间
- datetime 日期+时间
- timedelta 时间差
方法 | 方法说明 | 用法 |
---|---|---|
eq(…) | 等于(x==y) | x.eq(y) |
ge(…) | 大于等于(x>=y) | x.ge(y) |
gt(…) | 大于(x>y) | x.gt(y) |
le(…) | 小于等于(x<=y) | x.le(y) |
lt(…) | 小于(x<y) | x.lt(y) |
ne(…) | 不等于(x!=y) | x.ne(y) |
返回值为True\False
import datetimedate_a=datetime.date(2020,1,1)
date_b=datetime.date.today()# 返回一个今天的date类print(type(date_b)) #<class 'datetime.date'># 1. 日期比较
print(date_b.__eq__(date_a)) # False
print(date_b.__gt__(date_a)) # True# 2. 时间差
print(date_b.__sub__(date_a)) #81 days, 0:00:00
print(date_b.__rsub__(date_a)) #-81 days, 0:00:00# 3.ISO标准
print(date_a.isocalendar()) #输出元祖 (2020, 1, 3)
print(date_a.isoformat()) #2020-01-01# 4.输出字符串
print(date_a.__format__("%Y=%m=%d")) #2020=01=01
print(date_a.__str__()) #2020-01-01
print(date_a.ctime()) #Wed Jan 1 00:00:00 2020#
now=datetime.datetime.now()print(now.date()) #拆成date类 2020-03-22
print(now.time()) #拆成time类 19:24:52.398586print(datetime.datetime.combine(now.date(),now.time())) #合并成datetime类 2020-03-22 19:26:52.827282# timedelta
birth_day=datetime.date(598,1,28)
dead_day=datetime.date(649,7,10)# 活了多少天
print(type(dead_day.__sub__(birth_day))) #<class 'datetime.timedelta'>
print(dead_day.__sub__(birth_day)) #18790 days, 0:00:00
print(dead_day.__sub__(birth_day).days) #18790print(dead_day-birth_day)#18790 days, 0:00:00#时间差类
time_delta=datetime.timedelta(days=8,hours=8,minutes=8,seconds=8)# 八天八个小时八分八秒后的日期
print(now+time_delta) #2020-03-31 03:43:57.750139
张同学python上课笔记相关推荐
- 最近‘张同学’在DY实在是太火了,忍不住用Python分析了一下他的dy评论数据,相信有朝一日我也能够爆火起来
最近抖音张同学突然火了,两个月涨粉一千多万. 今天这篇文章,我抓取了张同学的视频的评论数据,想从文本分析的角度,挖掘一下大家对张同学感兴趣的点. 张同学 10.4号开始发视频,视频的点赞量一直很高,1 ...
- 为什么抖音张同学这么火爆?用 Python 分析 1w+条评论数据,我发现了其中的秘密
大家好,最近抖音张同学突然火了,两个月涨粉一千多万.今天这篇文章,我抓取了张同学的视频的评论数据,想从文本分析的角度,挖掘一下大家对张同学感兴趣的点. 张同学 10.4号开始发视频,视频的点赞量一直很 ...
- 用Python分析张同学dy评论数据
首先 相信有很多小伙伴都喜欢玩抖音吧,最近抖音张同学突然火了,两个月涨粉一千多万.看了他的视频,满满的生活气息,让人有一种家的感觉.这就让我很感兴趣了,必须得用Python对他分析一下. 今天这篇文章 ...
- Python学习笔记No1
本篇博客是博主自己在这里:https://github.com/jackfrued/Python-100-Days 学习Python时做的一些笔记,由于我已经有了一些基础(因为学习过C语言.Java等 ...
- 字节跳动大佬的Python自学笔记.pdf
1. 字节跳动大佬的Python自学笔记 这是我的一个朋友自学资料包,通过这个资料包自学拿到了字节跳动的Offer, 下面是他之前入门学习Python时候的学习资料,非常全面,从Python基础.到w ...
- Python 学习笔记(3)对txt文件的读与写操作(下)
上一章节我们讨论了如何对txt文本文件进行读写操作,这一张将讨论如何进行二进制文件的写与读.<Python 学习笔记(3)对txt文件的读与写操作(上)>的链接如下https://blog ...
- Python学习笔记:Day15 部署Web App
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:web开发3
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:访问数据库
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
最新文章
- 关于对象、构造函数、原型、原型链、继承
- 疫情下的硅谷区块链创业者
- java 如何判定消息已在队列_Java面试—消息队列
- mysql 导入超时_sql数据库有1000M怎么导入mysql?导入超时怎么办?
- Linux Shell常用技巧(六)
- PC-计算机动行命令里的密密!系统管理程序!
- 在Android App中集成Google登录
- [vue] 说说你对vue组件的设计原则的理解
- FPN论文解读(附网络结构层次代码)
- new与malloc的不同
- TypeScript:运算符
- 消防荷载楼板按弹性还是塑性计算_技术周刊 | 关于荷载输入若干问题的解答
- 在过程中要正式批准可交付成果_2014年PMP考试模拟题
- WEB通信之 长连接、长轮询(long polling)
- Servlet 中的四大作用域
- Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储
- php程序员 一万小时定律,科学网—一万小时定律——阅读笔记 - 贾琳的博文
- android官方自带下拉刷新功能
- 怎么卸载影子系统?卸载影子系统解决方法
- PS 合并RGB通道 编辑单通道