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=&copyright=&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)

posted @ 2021-09-16 14:18  darling331  阅读(213)  评论(0编辑  收藏  举报