gpt4 book ai didi

python - 在 whois 包中扩展 Python 模块

转载 作者:行者123 更新时间:2023-12-01 06:28:42 25 4
gpt4 key购买 nike

我正在使用 python 的 whois 模块来检查 .by 区域中的免费域。该模块目前不支持。但我需要做的就是将这些代码添加到 .../lib/python3.8/site-packages/whois/tld_regexpr.py:

by = {
'extend': 'com'
}

我认为硬编码到 lib 文件夹中是不正确的。我的代码现在看起来像这样:

import whois

def free_domains(domain_list):
"""Looking for free domains"""
free_d = []
for domain in domain_list:
if whois.query(domain) is None:
free_d.append(domain)
return free_d

但是如果没有这些注入(inject),它就无法工作。 🤔 如何从 .py 文件扩展 tld_regexpr.py?

最佳答案

作为引用,这里是 whois.tld_regexpr 的源代码。它用于 whois._2_parse 像这样:

from . import tld_regexpr

TLD_RE = {}


def get_tld_re(tld):
if tld in TLD_RE:
return TLD_RE[tld]
v = getattr(tld_regexpr, tld)
extend = v.get('extend')

if extend:
e = get_tld_re(extend)
tmp = e.copy()
tmp.update(v)
else:
tmp = v

if 'extend' in tmp:
del tmp['extend']

TLD_RE[tld] = dict((k, re.compile(v, re.IGNORECASE) if isinstance(v, str) else v) for k, v in tmp.items())
return TLD_RE[tld]


[get_tld_re(tld) for tld in dir(tld_regexpr) if tld[0] != '_']

正如我们所看到的,这运行了一些模块级代码,这些代码根据 tld_regexpr 中的数据生成正则表达式。并将它们缓存在TLD_RE中全局表。

令人烦恼的是,没有办法轻松扩展tld_regexpr 发生这种情况之前,因为该模块是从顶层导入的 __init__.py 。然后,内部代码甚至不使用 get_tld_re之后,即使它提供了一个缓存接口(interface):/所以你需要调用这个 get_tld_re添加新 TLD 后明确显示。像这样的东西:

from whois import tld_regexpr
from whois._2_parse import get_tld_re # a "private" module, but they leave us little choice
tld_regexpr.by = {
'extend': 'com'
}
get_tld_re('by')

之前:

>>> whois.query('bayern.by')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/embray/src/python-whois/whois/__init__.py", line 60, in query
raise UnknownTld('Unknown TLD: %s\n(all known TLD: %s)' % (tld, list(TLD_RE.keys())))
whois.exceptions.UnknownTld: Unknown TLD: by
(all known TLD: ['com', 'uk', 'ac_uk', 'ar', 'at', 'pl', 'be', 'biz', 'br', 'ca', 'cc', 'cl', 'club', 'cn', 'co', 'jp', 'co_jp', 'cz', 'de', 'edu', 'eu', 'fr', 'id', 'info', 'io', 'it', 'kr', 'kz', 'ru', 'lv', 'me', 'mobi', 'mx', 'name', 'net', 'nyc', 'nz', 'online', 'org', 'pharmacy', 'press', 'pw', 'store', 'rest', 'ru_rf', 'security', 'sh', 'site', 'space', 'tech', 'tel', 'theatre', 'tickets', 'tv', 'us', 'uz', 'video', 'website', 'wiki', 'xyz'])

之后:

>>> from whois import tld_regexpr
>>> from whois._2_parse import get_tld_re # a "private" module, but they leave us little choice
>>> tld_regexpr.by = {
... 'extend': 'com'
... }
>>> get_tld_re('by')
{'domain_name': re.compile('Domain Name:\\s?(.+)', re.IGNORECASE), 'registrar': re.compile('Registrar:\\s?(.+)', re.IGNORECASE), 'registrant': None, 'creation_date': re.compile('Creation Date:\\s?(.+)', re.IGNORECASE), 'expiration_date': re.compile('Registry Expiry Date:\\s?(.+)', re.IGNORECASE), 'updated_date': re.compile('Updated Date:\\s?(.+)$', re.IGNORECASE), 'name_servers': re.compile('Name Server:\\s*(.+)\\s*', re.IGNORECASE), 'status': re.compile('Status:\\s?(.+)', re.IGNORECASE), 'emails': re.compile('[\\w.-]+@[\\w.-]+\\.[\\w]{2,4}', re.IGNORECASE)}
>>> whois.query('bayern.by')
<whois._3_adjust.Domain object at 0x6ffffbbc9e8>

我猜这个模块没有最好的可扩展性设计,但没关系——可以通过一些小调整来修复。同时,您应该向作者提交 PR 以添加更多 ccTLD,或者使扩展性更容易。

关于python - 在 whois 包中扩展 Python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60007302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com