全部知识点思维导图

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]

操作

  1. 增加
    .append()
  2. 删除
    .remove()
  3. 修改
    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)

键的要求

  1. 只能出现一次,出现多次按照最后的为准
  2. 不能改变,只能用数字,字符串,元组 不能用列表

字典的常用函数

  • dict.get(key) 范围字典key对应的值,不存在则返回None
  • dict.setdefault(key) 范围字典key对应的值,不存在则返回None并添加到字典里
  • dict.keys() 返回所有的key
  • dict.value() 返回所有的value
  • dict.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上课笔记相关推荐

  1. 最近‘张同学’在DY实在是太火了,忍不住用Python分析了一下他的dy评论数据,相信有朝一日我也能够爆火起来

    最近抖音张同学突然火了,两个月涨粉一千多万. 今天这篇文章,我抓取了张同学的视频的评论数据,想从文本分析的角度,挖掘一下大家对张同学感兴趣的点. 张同学 10.4号开始发视频,视频的点赞量一直很高,1 ...

  2. 为什么抖音张同学这么火爆?用 Python 分析 1w+条评论数据,我发现了其中的秘密

    大家好,最近抖音张同学突然火了,两个月涨粉一千多万.今天这篇文章,我抓取了张同学的视频的评论数据,想从文本分析的角度,挖掘一下大家对张同学感兴趣的点. 张同学 10.4号开始发视频,视频的点赞量一直很 ...

  3. 用Python分析张同学dy评论数据

    首先 相信有很多小伙伴都喜欢玩抖音吧,最近抖音张同学突然火了,两个月涨粉一千多万.看了他的视频,满满的生活气息,让人有一种家的感觉.这就让我很感兴趣了,必须得用Python对他分析一下. 今天这篇文章 ...

  4. Python学习笔记No1

    本篇博客是博主自己在这里:https://github.com/jackfrued/Python-100-Days 学习Python时做的一些笔记,由于我已经有了一些基础(因为学习过C语言.Java等 ...

  5. 字节跳动大佬的Python自学笔记.pdf

    1. 字节跳动大佬的Python自学笔记 这是我的一个朋友自学资料包,通过这个资料包自学拿到了字节跳动的Offer, 下面是他之前入门学习Python时候的学习资料,非常全面,从Python基础.到w ...

  6. Python 学习笔记(3)对txt文件的读与写操作(下)

    上一章节我们讨论了如何对txt文本文件进行读写操作,这一张将讨论如何进行二进制文件的写与读.<Python 学习笔记(3)对txt文件的读与写操作(上)>的链接如下https://blog ...

  7. Python学习笔记:Day15 部署Web App

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Python学习笔记:web开发3

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:访问数据库

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 关于对象、构造函数、原型、原型链、继承
  2. 疫情下的硅谷区块链创业者
  3. java 如何判定消息已在队列_Java面试—消息队列
  4. mysql 导入超时_sql数据库有1000M怎么导入mysql?导入超时怎么办?
  5. Linux Shell常用技巧(六)
  6. PC-计算机动行命令里的密密!系统管理程序!
  7. 在Android App中集成Google登录
  8. [vue] 说说你对vue组件的设计原则的理解
  9. FPN论文解读(附网络结构层次代码)
  10. new与malloc的不同
  11. TypeScript:运算符
  12. 消防荷载楼板按弹性还是塑性计算_技术周刊 | 关于荷载输入若干问题的解答
  13. 在过程中要正式批准可交付成果_2014年PMP考试模拟题
  14. WEB通信之 长连接、长轮询(long polling)
  15. Servlet 中的四大作用域
  16. Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储
  17. php程序员 一万小时定律,科学网—一万小时定律——阅读笔记 - 贾琳的博文
  18. android官方自带下拉刷新功能
  19. 怎么卸载影子系统?卸载影子系统解决方法
  20. PS 合并RGB通道 编辑单通道

热门文章

  1. Linux系统内存不够用怎么办?释放Linux内存的教程
  2. 微服务和分布式的概念和区别
  3. echartjs 绘制 圆环 排版
  4. matlab求非线性函数的解,MATLAB求解非线性方程(转)
  5. 树莓派 PHP白屏,树莓派3.5英寸屏幕安装显示驱动,解决白屏问题
  6. android studio adb操作
  7. linux命令不能打中文,在Linux系统下Dia无法输入中文的解决方法
  8. vscode编辑器,相对路径文件读取失败
  9. 小红书日常实习一面面经
  10. JAVA计算机毕业设计城市智能公交系统Mybatis+系统+数据库+调试部署