#!/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值集合