Python 开发中遇到的问题笔记
请求一个附件地址,并将附件下载下来
import requests
url = 'https://js.shaanxi.gov.cn/userfiles/2021-Year/8-Month/31-Day/附件:8-2三类人员跨省变更人员名单.xls'
res = requests.get(url)
with open("./8-2三类人员跨省变更人员名单.xls", 'wb') as f:
f.write(res.content)
我觉得这里的文件名,可以使用正则表达式解析出来;参数wb 一般适用于文件,图片的存储
判断某个字符串是否在字符串中存在
new_url = "<p><iframe height="'600'" src="'/userfiles/2021-Year/8-Month/20-Day/陕西省住房和城乡建设厅2020年部门决算公开.pdf'" width="'800'"></iframe></p>"
res = ".pdf" in new_url
print(res)
这里返回True
python的boolean值为True 和 False 注意首字母是大写的,可以用1 0 代替
测试网页的编码格式
import urllib.parse
import chardet # 字符集检测
import urllib.request
def automatic_detect(url):
content = urllib.request.urlopen(url).read()
result = chardet.detect(content)
encoding = result['encoding']
return encoding
urls = ['http://www.baidu.com', 'http://www.163.com', 'http://dangdang.com']
for url in urls:
print(url, automatic_detect(url))
依次输出
http://www.baidu.com utf-8
http://www.163.com utf-8
http://dangdang.com GB2312
正则表达式匹配网站取出域名
import requests
import re
url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1590287165698_R&pv=&ic=&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E9%A3%8E%E6%99%AF'
r = requests.get(url).text
pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') # 匹配模式
result = re.findall(pattern, str(r)) # 匹配2和0之前的数据
for ress in result:
pattern = re.compile(r'http[s]?://(.+?)/')
print(pattern.search(ress).group())
print(re.findall(r'http[s]?://(.+?)/', ress))
print(result)
判断一个链接是否包含域名
场景,有的网站存储的文件地址,是不带域名的,需要和当前访问的域名进行拼接,有的是存储的完整域名,那么可以用到判断,来表示是否需要进行当前访问网站的域名拼接,得到完整的文件下载地址
pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') # 匹配模式
strd = "/userfiles/2021-Year/8-Month/20-Day/陕西省住房和城乡建设厅2020年部门决算公开.pdf"
print(pattern.search(strd) is not None)
print(re.search(r'abc', 'abcef').group())
print(re.search(r'abc', 'abcef'))
print(re.search(r'abc', 'aBcef'))
带group 返回的是匹配对象的值
不带group 返回的匹配对象
正则表达式匹配ip端口
import re
strdd = "http://222.90.206.20:8888/userfiles/2016-Year/12-Month/30-Day/%E9%99%84%E4%BB%B67%EF%BC%9A12%E6%9C%8819%E6%97%A5%E8%87%B312%E6%9C%8823%E6%97%A5%E5%9B%AD%E6%9E%97%E7%BB%BF%E5%8C%96%E4%BC%81%E4%B8%9A%E8%B5%84%E8%B4%A8%E5%BB%B6%E7%BB%AD%E5%AE%A1%E6%A0%B8%E8%A1%A8.docx"
print(urllib.parse.unquote(strdd)) ## 先将中文解码
strdd = 'http://222.90.206.20:8888/userfiles/2016-Year/12-Month/30-Day/附件7:12月19日至12月23日园林绿化企业资质延续审核表.docx'
ddd = '/userfiles/2016-Year/12-Month/30-Day/附件7:12月19日至12月23日园林绿化企业资质延续审核表.docx'
ip_port = re.compile(r'http[s]?://(?:(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:[0,1]?\d?\d|2[0-4]\d|25[0-5]):\d{0,5}/')
print(ip_port.sub("ddaaa", strdd)) # 将匹配到数据进行替换
print(ip_port.sub("ddaaa", ddd)) # 如果匹配不到数据,就显示原数据
python split 函数拆分字符串
print(type(''))
strd = "/userfiles/2021-Year/8-Month/20-Day/陕西省住房和城乡建设厅2020年部门决算公开.pdf"
print(strd.split(".")[-1])
输出 pdf
Url 转码/解码
import urllib.parse
strd = "%2Fuserfiles%2F2021-Year%2F8-Month%2F20-Day%2F%E9%99%95%E8%A5%BF%E7%9C%81%E4%BD%8F%E6%88%BF%E5%92%8C%E5%9F%8E%E4%B9%A1%E5%BB%BA%E8%AE%BE%E5%8E%852020%E5%B9%B4%E9%83%A8%E9%97%A8%E5%86%B3%E7%AE%97%E5%85%AC%E5%BC%80.pdf"
print(urllib.parse.unquote(strd))
print(urllib.parse.quote("我的 的 的"))
将html代码字符串转为Soup对象,进行操作
from bs4 import BeautifulSoup
stss = '<a href="/7/7877/3595785.html">第一章 陨落的天才</a>'
bf = BeautifulSoup(stss, 'html.parser')
print(bf, type(bf))
print(bf.find_all('a')[0].get('href'))
print(bf.find_all('a')[0].text+'.txt')
python 多线程处理
import threading
from time import sleep
def reste(chapter, chapter_herf, sleeptime):
sleep(sleeptime)
print('===================')
# doSomeThing
# content = get_contents(chapter_herf)
# write_txt(chapter, content, 'utf8')
t1 = threading.Thread(target=reste, args=('parm1', 'parm2', 1))
t1.start()
t2 = threading.Thread(target=reste, args=('parm1', 'parm2', 1))
t2.start()
threading.Thread(target=reste, args=('parm1', 'parm2', 1)).start()
Python 对集合、字典的操作
列表
aa = []
print(len(aa))
aa.append(1)
aa.append(2)
aa.append(3)
aa.append(4)
aa.append(5)
aa.append(5)
aa.append(2)
print(aa)
aa.remove(2)
aa.remove(aa[2])
bb = []
bb.append(5)
bb.append(5)
bb.append(2)
aa.extend(bb)
# aa.clear()
print(aa)
print(len(aa))
集合
dd=set() # 定义一个空集合
dd.add(1) # 往集合里添加元素
dd.update([10,20,50])
字典
dict8 = {"name": "张三", "age": 18}
l1 = dict8.get("name")
print(l1) # 张三
# 想要获取的键不存在,使用get不会报错,默认返回None
l2 = dict8.get("sex")
print(l2) # None
# 指定没有相应键时的返回值
l3 = dict8.get("sex", "没有获取到")
print(l3) # 没有获取到
# keys
keys = dict8.keys()
print(keys) # dict_keys(['name', 'age'])
print(list(keys)) # ['name', 'age']
# 获取字典的key
for key in dict8.keys():
print(key)
# 获取字典的value
for value in dict8.values():
print(value)
for i in dict8.items():
print(i) # 以key,value的形式放在元组中('age', 18)
# 通过元组拆包获取key,value
for key, value in dict8.items():
print(key, value)
# 先获取key 再用key获取value
for key in dict8:
print(dict8.get(key))
#字典添加新值
dict8.update({'filter': filter_encode})
dict8[filter] = filter_encode
# 如果key已经存在,那么会替换原来的value
dict8.setdefault('filter', filter_encode)
# 如果key已经存在,不会执行新增
#### 对于只有一个键值对的字典分别取出键和值
def darling(name):
recc = [{123: 'RC123'}, {456: 'RC1456'}, {789: 'RC789'}, {1231: 'RC1231'}]
for rec in recc:
print(rec)
print('==========1=========')
# print(rec.values())
print(list(rec.keys())[0])
# print(rec.values())
print(list(rec.values())[0])
ksy, value = next(iter(rec.items()))
print('==========2=========')
print(ksy)
print(value)
ksy, value = rec.popitem()
print('==========3=========')
print(ksy)
print(value)
字符串类型list转换成list
# 方法一
import ast
str_list = "[11.23,23.34]"
list_list = ast.literal_eval(str_list)
print(type(list_list))
# 方法二
import json
str_list = "[11.23,23.34]"
list_list = json.loads(str_list)
print(type(list_list))
#得到的结果
<class 'list'>
字典的增删改查
新增:
dict["新key"] = "value"
如果key已经存在,那么会替换原来的value
dict.setdefault("新key","新value")
如果key已经存在,不会执行新增
删除:
pop("key")
指定key删除
popitem()
随机删除
del dict[key]
也是删除# dict是你创建的字典名称
clear()
清空字典
查询:
print(dic["key"])
打印 key 对应的内容
peint(dic.get("key"))
打印对应的内容,key不存在返回none
peint(dic.get("没有的key"),"返回的内容")
key不存在返回输入的内容
注意:setdefault()
执行新增流程,如果key已经存在,不会执行新增,直接查询内容
字典和列表进行函数传参
def fun(a, b, c):
print('a=', a)
print('b=', b)
print('c=', c)
fun(10, 20, 30) # 函数调用时的参数传递,称为位置传参
lst = [11, 22, 33]
fun(*lst) # 在函数调用时,将列表中的每个元素都转换为位置实参擦混入
fun(a=100, c=220, b=330) # 函数的调用,关键字实参传入
print('==============================================')
dic = {'a': 55, 'b': 66, 'c': 77}
fun(**dic) # 在函数调用时,将字典中的键值对都转换为关键字实参传入
def fun1(a, b=10): # a,b 都是在函数定义处,都是形参,但是b有默认值,所以b又是默认值形参
print('a=', a)
print('b=', b)
def fun2(*args): # 个数可变的位置形参
print(args) # 结果是一个元组
def fun3(**args2): # 个数可变的关键字形参
print(args2) # 结果是一个字典
fun2(10, 20, 30)
fun3(a=20, b=30)
def fun4(a, b, *, c, d): # c,d 只能按照关键字实参传递
print('a=', a)
print('b=', b)
print('c=', c)
print('d=', d)
fun4(1, 2, c=3, d=4)
# 函数定义时的相残顺序
def fun5(a, b, *, c, d, **args):
pass
def fun6(*args, **arges2):
pass
def fun7(a, b=10, *agre, **arges):
pass
列表解析
squares = []
for value in range(1,11):
squares.append(value**2)
print(squares)
## 等同于,这就是列表解析式
squares = [value**2 for value in range(1,11)]
print(squares)
惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
一代天骄,成吉思汗,只识弯弓射大雕。
俱往矣,数风流人物,还看今朝