• python笔记四


    #!/usr/bin/env python3
    from datetime import datetime, timedelta
    # datetime是模块,datetime模块还包含一个datetime类
    now = datetime.now()
    print(now) # 2019-09-19 11:20:42.173987
    print(datetime(2019,9,19,11,21)) #2019-09-19 11:21:00
    print(now.timestamp()) #1568863370.637641 转时间戳 Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数
    print(datetime.fromtimestamp(1568863370)) # 2019-09-19 11:22:50 时间戳转datetime
    print(datetime.strptime('2019-9-19 11:33:20','%Y-%m-%d %H:%M:%S')) # 2019-09-19 11:33:20 字符串转datetime
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) #2019-09-19 11:36:13 把时间转字符串
    
    # timedelta 处理时间加减
    print(datetime.now() + timedelta(days=2,hours=1, minutes=20)) # 2019-09-21 13:01:41.009561
    
    # namedtuple namedtuple是一个函数,它用来创建一个自定义的tuple对象,
    # 并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素
    
    from collections import namedtuple
    # 具名元组
    d = namedtuple('dot', ['a', 'b', 'c', 'd'])
    
    d = d(1,2,3,4)
    print(d.a,d.b,d.c,d.d) #1 2 3 4
    
    # 具名元组除了拥有继承自基本元组的所有方法之外,还提供了额外的几个方法和两个属性,为了防止命名冲突,这些方法都会以下划线开头
    
    list = [1,2,3,4]
    d._make(list) # 使用这个函数来构建具名元组实例
    print(d) # dot(a=1, b=2, c=3, d=4)
    
    # 修改对象属性,使用"_replace"方法 不是直接修改原来的对象
    mod = d._replace(a=11)
    print(mod) # dot(a=11, b=2, c=3, d=4)
    
    # 对象转换成字典,使用"_asdict"
    print(d._asdict()) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
    
    
    # Base64是一种用64个字符来表示任意二进制数据的方法
    # Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示
    # Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据
    import base64
    # 转base64
    b = base64.b64encode('我是谁啊'.encode('utf-8'))
    print(b)
    #
    print(base64.b64decode(b))
    
    # 由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_
    # base64.urlsafe_b64encode()
    # base64.urlsafe_b64decode()
    
    # MD5
    # 由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,
    # 这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
    # md5(message + salt)
    
    import hashlib
    
    md5 =hashlib.md5()
    md5.update('hello leyi'.encode('utf-8'))
    print(md5.hexdigest()) # 2fd60377888d53f6dafef6f8da3c09c2
    
    # 如果数据量很大,可以分块多次调用update(),结果一样
    md5.update('hello'.encode('utf-8'))
    md5.update(' leyi'.encode('utf-8'))
    print(md5.hexdigest()) #2fd60377888d53f6dafef6f8da3c09c2
    
    # 另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似
    sha1 = hashlib.sha1()
    
    
    # Python自带的hmac模块实现了标准的Hmac算法,跟md5加盐加密类似
    
    import hmac
    
    # hmac.new(key, message, digestmod='MD5')  digestmod 为采用的算法
    secret = hmac.new('关键字盐'.encode('utf-8'), '需要加密内容'.encode('utf-8'), digestmod='MD5')
    print(secret.hexdigest())
    
    # urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应
    from urllib import request, parse
    import ssl
    
    ssl._create_default_https_context = ssl._create_unverified_context
    
    # req = request.Request('http://api-doc.xxx.cn/api/user/login')
    # req.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36')
    # req.add_header('Origin', 'http://api-doc.xxx.cn')
    # req.add_header('Referer', 'http://api-doc.xxx.cn/login')
    #
    # name = input('输入账户:')
    # password = input('输入密码:')
    # login_data = parse.urlencode([
    #     ('email', name),
    #     ('password', password),
    # ])
    #
    # with request.urlopen(req, data = login_data.encode('utf-8')) as f:
    #     d = f.read()
    #     print(dir(f))
    #     print(f.status)
    #     print(d.decode('utf-8'))
    
    from html.parser import HTMLParser
    
    # 继承HTMLParser
    class ReWriteHTMLParser(HTMLParser):
    
        def __init__(self):
            HTMLParser.__init__(self)
            self.metas = []
    
        # 重写
        def handle_starttag(self, tag, attrs):
            if tag == "meta":
                if len(attrs) == 0:
                    pass
                else:
                    for (key, value) in attrs:
                        if (key == "content"):
                            self.metas.append(value)
    
    
    
    parser = ReWriteHTMLParser()
    parser.feed(
        '''
            <meta  id="cross-request-sign"  charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
            <meta name="keywords" content="yapi接口管理,api管理,接口管理,api,接口,接口文档,api文档,接口管理系统" />
            <meta name="description" content="YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。" />
            <title>YApi-高效、易用、功能强大的可视化接口管理平台</title>
            <link rel="icon" type="image/png" sizes="192x192" href="/image/favicon.png">
            <script>
                document.write('<script src="/prd/assets.js?v=' + Math.random() + '"></script>');
            </script>
            
            <script>
                document.write('<link rel="stylesheet"  href="/prd/' + window.WEBPACK_ASSETS['index.js'].css + '" />');
            </script>
        '''
    )
    # ['width=device-width, initial-scale=1, shrink-to-fit=no',
    # 'yapi接口管理,api管理,接口管理,api,接口,接口文档,api文档,接口管理系统',
    # 'YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。
    # 可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,
    # 开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。']
    print(parser.metas) # 获取开始标签为meta attrs个数不为0的content值集合
    

     

  • 相关阅读:
    begin lydsy 2731
    关于js中this关键字的补充
    js中this关键字测试集锦
    js文件中函数前加分号和感叹号是什么意思?
    好用的wget命令从下载添加环境变量到各参数详解
    一个解析json串并组装echarts的option的函数解析
    oschina代码仓库远程push,pull免密实操总结
    yii 核心类classes.php详解(持续更新中...)
    yii2.0归档安装方法
    配置windows 系统PHP系统环境变量
  • 原文地址:https://www.cnblogs.com/leyi/p/11573767.html
走看看 - 开发者的网上家园