在Python中,如何循环遍历此列表并将每个项调用到同一个函数?
你好,我正在尝试建立一个脚本,将列出网站的SSL证书到期日期。code在Python中,如何循环遍历此列表并将每个项调用到同一个函数?,python,python-3.x,pyopenssl,Python,Python 3.x,Pyopenssl,你好,我正在尝试建立一个脚本,将列出网站的SSL证书到期日期。codedef sslExpiresDate的第一个函数本身工作得非常好。当我添加第二个函数def all_sites\u list时,我的代码已被破坏。我不知道如何运行sslExpiresDate来获取列表站点中每个URL的结果。我试图通过构建第二个函数并从中调用第一个函数来实现这一点,但它不起作用 我希望预期的结果是一个可读的表格格式(但我还没有做到这一点)。比如: SITE EXP DATE www.s
def sslExpiresDate
的第一个函数本身工作得非常好。当我添加第二个函数def all_sites\u list
时,我的代码已被破坏。我不知道如何运行sslExpiresDate
来获取列表站点中每个URL的结果。我试图通过构建第二个函数并从中调用第一个函数来实现这一点,但它不起作用
我希望预期的结果是一个可读的表格格式(但我还没有做到这一点)。比如:
SITE EXP DATE
www.site1.com 03-05-18
www.site2.com 08-12-19
www.site3.com 12-12-21
同时,这是我正在努力解决的代码。谢谢:
import OpenSSL
import ssl
sites = ['www.site1.com', 'www.site2.com', 'www.site3.com']
def sslExpiresDate():
cert = ssl.get_server_certificate((sites, 443))
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
print(x509.get_notAfter())
return
def all_sites_list(sites, sslExpiresDate):
for site in sites():
sslExpiresDate(site)
return
all_sites_list(sites, sslExpiresDate)
map函数允许您将序列中的每个值发送给生成结果序列的函数。您可以将此序列与原始序列压缩,以获得所需的表:
import OpenSSL
import ssl
from datetime import datetime
dateformat = '%Y%m%d%H%M%SZ'
sites = ['www.google.com', 'www.plus.net']
def sslExpiresDate(site):
cert = ssl.get_server_certificate((site, 443))
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
return datetime.strptime(x509.get_notAfter().decode(),dateformat).date().isoformat()
def all_sites_list(sites, sslExpiresDate):
return list(zip(sites,map(sslExpiresDate,sites)))
tab_format = '{:18s}{:18s}'
print(tab_format.format('SITE','EXP DATE'))
for site in sorted(all_sites_list(sites, sslExpiresDate), key=lambda site: site[1]):
print(tab_format.format(*site))
给出:
SITE EXP DATE
www.google.com 2018-07-10
www.plus.net 2020-02-27
代码不起作用的原因是您正在为站点中的站点()执行:
,而不是为站点中的站点执行:
。你的站点
是一个列表,而不是一个返回列表的函数,因此你不需要调用它。除此之外,你还需要编写其他内容,比如将输出格式化为你想要的格式。您可能可以通过各种方式改进代码,例如,让sslExpiresData
返回一个值供调用方使用,而不是打印出来,什么也不返回。但是您遇到的问题只是一个简单的输入错误。您使用一个参数调用sslExpiresDate()
,但函数本身没有声明接受任何参数。此外,将该函数作为参数传递给all\u sites\u list()
(它可以通过名称直接访问)也没有意义,尽管您可能正计划在将来指定其他函数。非常感谢,这是完美的,也是我一直在寻找的。最后一个问题,是否可以按最接近到期日期的日期设置该列表的格式?是的,我们只需要按日期排序。更改代码以适应。别忘了给我打勾!那只是意味着一次投票权,对吗?我试过了,但我认为我的声誉不足以让它出现:(标记它工作得很好,非常感谢你的帮助。我想问,行中的*符号是做什么的:print(tab_format.format(*site))
我将对您提供的一些代码片段做更多的研究,但我需要知道要查找什么。我对key=lambda site:site[1])也有点迷茫。
key=lambda是什么意思?就像我说的,一切都很好,但我想自己去学,下次再学。这些行与Python的哪个部分相关?