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
相关产品推荐
相关产品推荐

