如何从Python dns.resolver的DNS查询响应中提取纯IP地址?
提取DNS查询结果中的IP地址
你不需要处理完整的DNS响应报文,dns.resolver.resolve()返回的answer对象本身就包含了可直接提取的IP记录。以下是修改后的代码,能直接得到列表/字典格式的结构化结果:
import dns.resolver my_resolver = dns.resolver.Resolver() dns_list = ['8.8.8.8', '8.8.4.4', '1.2.3.4'] # 用字典存储每个DNS服务器对应的查询结果 query_result = {} for server in dns_list: try: my_resolver.nameservers = [server] # 执行A记录查询(默认就是A记录,可显式指定dns.rdatatype.A) answer = my_resolver.resolve('google.com', dns.rdatatype.A) # 提取所有IP地址到列表 ip_list = [record.address for record in answer] query_result[server] = ip_list print(f"[{server}] 查询到IP: {ip_list}") except dns.resolver.LifetimeTimeout: query_result[server] = "查询超时" print(f"[{server}] 错误: 查询超时") except dns.resolver.NXDOMAIN: query_result[server] = "域名不存在" print(f"[{server}] 错误: 域名不存在") except Exception as e: query_result[server] = f"查询失败: {str(e)}" print(f"[{server}] 错误: {str(e)}") # 输出最终结构化结果 print("\n=== 最终结构化结果 ===") print(query_result)
关键说明
answer是可迭代对象,每个元素对应一条DNS记录,通过record.address属性可直接获取IP字符串。- 用列表推导式
[record.address for record in answer]可以快速得到IP列表,满足你对结构化数据的需求。 answer.response是完整的DNS报文对象,仅用于调试或需要分析完整响应头/权威记录等场景,提取IP时无需使用它。
内容的提问来源于stack exchange,提问作者Husky-CGN
相关产品推荐
相关产品推荐

