学自菜鸟教程
特别注意,python中空格不能随便按!!!!!!!
注释与输入输出
'''
啊我被注释十了
'''
# 巧了我也是
"""
呃还有我
"""
从键盘输入
input("请输入:");
输出
a='name'
b='age'
print(a,b)
print(f'{a} {b}')
print("%s %s" %(a,b))
#三种输出都为:name age
print('{格式}'.format(要格式化的数据))
#格式化输入输出
运算
//#取整除赋值运算符
/ #除法
列表 [可更改]
- 列表的增删
list = ['red', 'green', 'blue', 'yellow', 'white']
# 增:append
list.append('black')
# 删:del
del list[0]
print (list)
#输出:['green', 'blue', 'yellow', 'white','black'r]
- 可以对列表进行拼接,数学运算
[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]
[1] * 4 = [1,1,1,1]
元组(不可更改元素)
tup2 = (1, 2, 3, 4, 5 )
tup2 = 1, 2, 3, 4, 5
- 元组中的元素不能修改,但可以对整个元组进行操作
字典
字典是另一种可变容器模型,且可存储任意类型对象。
d = {key1 : value1, key2 : value2, key3 : value3 }
d={'name':'yby' 'age':21 'like':'dance'}
#增
d['school']=48
#改
d['name']='ss'
#删(del还可以删除整个字典,该字典不存在
del d['name']
#清空字典(字典存在,内容清空
d.clear()
集合
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
# 集合间的运算:- | & ^(不同时包含于a和b的元素)
a = set('balance')
b = {'a','f','s','b'}
print(a^b)
# 输出:set(['c', 'e', 'f', 'l', 'n', 's'])
#增 删 ....
a.add(x)
a.remove(x)
索引循环与函数
正向:从0开始
反向:从-1开始
[起始位置(从下一位开始):终止位置(截止于本位置):步长(如果省略则则默认为1)]
eg:
list = ['a' 'b' 'c' 'd' 'e']
#正向 0 1 2 3 4
#反向 -5 -4 -3 -2 -1
print(list[-1])
print(list[ 4])
在 if , elif , else , for , while , class ,def 声明末尾添加 冒号
与range函数结合
for i in range(0, 10, 3) :
# 3这个参数可省,省略则默认步长为1
print(i)
#输出:0 3 6 9
函数同样使用 :与缩进代替花括号
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
加了两个星号 ** 的参数会以字典的形式导入。
文件流输入输出
open(file, mode='r')
#完整语法:
#open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
mode参数:
r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w :打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a :打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
+ :打开一个文件进行更新(可读可写)。
b: 二进制模式。
默认为文本模式,如果要以二进制模式打开,加上 b ,如果要更新同理,加上+
eg:
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
琐碎小点
在 python 用 import 或者 from…import 来导入相应的模块。
转义字符\
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用
pass 语句
Python pass是空语句,是为了保持程序结构的完整性,pass 不做任何事情,一般用做占位语句
某些函数
print (str.split( ))
# 以空格为分隔符
print (str.split('i',2))
# 以 i 为分隔符,分割两次
print (str.split('i',-1))
# 以 i 为分隔符,分割所有(如果没有第二个参数则默认为-1
print (str.split( )[0])
print (str.split( )[0].split('i')[-1])
#还可以这样用
'''
输出
['this', 'is', 'string', 'example....wow!!!']
['th', 's ', 's string example....wow!!!']
['th', 's ', 's str', 'ng example....wow!!!']
this
s
'''
爬虫初试
爬取网页上排行前30的网易云热歌
结果如图:
import requests
# pip install requests
from lxml import etree
# pip install lxml
#以上是爬取需要加载的库 井号内的部分需要到Terminal中加载
url = 'https://www.maigoo.com/top/420564.html'
#需要爬取的网站
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
}
#在开发者工具的Header中查看 或者burp suite抓包
html=requests.get(url,headers=headers).text
#以get方法 自定义headers请求方式
tree=etree.HTML(html)
#创建选择器对象
lis=tree.xpath('//*[@id="modellist-2139196"]/div/div/div')
# //*[@id="modellist-2139196"]/div/div/div[1]
#需要爬取的整个页面xpath(直接在开发者工具中copy—>xpath复制)
for li in lis:
# //*[@id="modellist-2139196"]/div/div/div[1]/div[1]/div[1]/div/a
#需要爬取的链接,文字,,,,
if li.xpath('./div/div[1]/div/a/text()')!=[]:
title=li.xpath('./div/div/div/a/text()')#文字
li_url=li.xpath('./div/div/div/a/@href')#链接
# print(title)
# print(li_url)
for x in range(0,len(title)):
print(title[x],li_url[x])
#遍历列表依次输出
#
'''
r=requests.get(url)
r.text HTTP响应内容的字符串形式,即,url对应的页面内容
r.content HTTP响应内容的二进制形式
requests.Timeout 请求URL超时,产生超时异常
requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
tip:xpath匹配规则:
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性
ookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
通配符
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
'''