将输出与列表/数组进行比较

时间:2010-12-03 16:22:29

标签: python arrays list mx-record

我认为自己是python的初学者(以及一般的编程!),但我正在努力工作,但是Zed A Shaw“努力学习python”,并且放慢了工作速度。 我正在写一个小脚本来检查一个域的实时mx记录是否符合预期并且没有被更改(长篇故事),到目前为止我有以下内容:

import dns.resolver
domain = 'bbc.co.uk'
for x in dns.resolver.query(domain,'MX',):
    print x.to_text()

这使用dnspython模块吐出mailhost和首选项编号。我现在需要做的是将此输出与两个预期结果进行比较,因此对于bbc.co.uk,这些将是cluster1a.eu.messagelabs.com。 &安培; cluster1.eu.messagelabs.com。 (它们的排序根据当前的首选项编号而变化)

我认为最好的方法是将预期的结果添加到数组/列表中并让脚本尝试将输出与数组/列表进行比较并提供真或假的声明,但是那天尝试不同的代码安排,到目前为止,这证明是我的理解。

最终,我希望它能提醒自己或我的同事,如果结果是错误的,但是可以等到稍晚,因为我还没有决定实施此方法的最佳方法。 任何善良的灵魂都能够给我一个粗略的轮廓,说明实现我希望的结果的最佳实践是什么?

我感谢任何花时间阅读此内容的人:)

谢谢你,Chris

编辑:这似乎完全符合我的希望,谢谢大家的帮助!

import dns.resolver
domain = 'bbc.co.uk'
expected_responses = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.']
for x in dns.resolver.query(domain, 'MX'):
        if x.to_text().split()[1] not in expected_responses:
                print "Unexpected MX record found!"
        else:
                print x.to_text().split()[1] + " OK!"

5 个答案:

答案 0 :(得分:3)

你的意思是:

x.to_text() in {'cluster1a.eu.messagelabs.com', 'cluster1.eu.messagelabs.com'}

答案 1 :(得分:1)

结果以“XX dns_entry”格式返回,因此您可以执行以下操作:

import dns.resolver
domain = 'bbc.co.uk'
results = []
for x in dns.resolver.query(domain,'MX',):
    results.append(x.to_text().split(' ')[1])
print results

>>> ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.']

现在您可以与此列表进行比较。

答案 2 :(得分:1)

好吧,首先你必须删除x.to_text()返回的前导数字:

txt = '20 cluster1a.eu.messagelabs.com.' # an example x.to_text()
txt = txt.split()[1] # Get rid of everything before (and including) the first space.

你可以循环地,或使用列表理解:

records = [x.to_text().split()[1] for x in dns.resolver.query(domain, 'MX')]

然后确保您所期望的一切都在记录中

expected = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.']
if False in [val in records for val in expected] or len(records) != len(expected):
    # Die.

答案 3 :(得分:1)

怎么样?

import dns.resolver

expected_domains = set(['cluster1a.eu.messagelabs.com.', 'cluster1.eu.messagelabs.com.'])
domains = set(str(mx.exchange) for mx in dns.resolver.query('bbc.co.uk', 'MX'))
if not domains.issuperset(expected_domains):
    print("Missing MX domains:", ", ".join(expected_domains - domains))

答案 4 :(得分:0)

编辑:这似乎完全符合我的希望,谢谢大家的帮助!

import dns.resolver
domain = 'bbc.co.uk'
expected_responses = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.']
for x in dns.resolver.query(domain, 'MX'):
        if x.to_text().split()[1] not in expected_responses:
                print "Unexpected MX record found!"
        else:
                print x.to_text().split()[1] + " OK!"