You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dnspython获取的TXT记录与同内容字符串比较返回不等如何解决

问题根因

dnspython的dns.resolver.resolve()查询返回的TXT记录条目是DNS rdata类型的对象,并非字符串。你直接打印时看到的内容是该对象的__str__方法格式化后的输出,和你定义的spf_wrong字符串字面量看起来一致,但二者类型完全不同,直接做相等比对必然返回False。

解决方法

只需要在比对前将rdata对象显式转换为字符串即可,同时需要修正原代码的两处逻辑问题:

  • 原代码最后比对时误用了循环变量dns_data,应该使用你筛选后存储SPF记录的dns_correct变量
  • 原代码将dns.resolver.resolve()放在了try块外部,查询失败时会直接抛出异常未被捕获
修改后的完整代码
import dns.resolver

domain = "google.co.uk"
spf_wrong = '"v=spf1 -all"'
dns_correct = None

try:
    test_spf = dns.resolver.resolve(domain , 'TXT')
    for dns_data in test_spf:
        dns_str = str(dns_data)
        if 'spf1' in dns_str:
            dns_correct = dns_str
            # 匹配到SPF记录就跳出循环,避免后续其他TXT记录覆盖
            break
except Exception as e:
    print("SPF record not found")

# 先判断是否成功拿到SPF记录,避免变量未定义报错
if dns_correct is None:
    print("未查询到有效SPF记录")
elif dns_correct == spf_wrong:
    print("same")
else:
    print("not same")
    print(dns_correct)
    print(spf_wrong)

如果需要去掉SPF记录外层的双引号比对,也可以在转换字符串后调用strip('"')去掉前后的双引号,再和不带外层引号的SPF字符串比对即可。

内容的提问来源于stack exchange,提问作者fraserc182

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:57:02