如何从python中的字典值获取特定条目

时间:2015-04-17 04:01:09

标签: python dictionary

这里,这是我的字典的价值,但我想得到的只是产品和443和80版本的详细信息。 有没有任何方法或命令的帮助,我们可以获得这些信息? 这是我的字典值:

   {'nmap': {'scanstats': {'timestr': 'Fri Apr 17 05:08:18 2015', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1', 'elapsed': '14.91'}, 'scaninfo': {'tcp': {'services': '80,443', 'method': 'connect'}}, 'command_line': 'nmap -oX - -p 80,443 -sV xxxx'}, 'scan': {'x.x.x.x': {'status': {'state': 'up', 'reason': 'syn-ack'}, 'hostname': 'xxxx', 'vendor': {}, 'addresses': {'ipv4': '0x.x.x'}, 'tcp': {'443': {'product': 'Apache Tomcat/Coyote JSP engine', 'name': 'http', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': '', 'state': 'open', 'version': '1.1', 'conf': '10'}, '80': {'product': 'Apache Tomcat/Coyote JSP engine', 'name': 'http', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': '', 'state': 'open', 'version': '1.1', 'conf': '0'}}}}}

因此。我跑了这个命令

      scan=[v for k,v in x.iteritems() if 'scan' in k]

它给出了以下结果:

    [{
    'x.x.x.x': {
        'status': {
            'state': 'up',
            'reason': 'syn-ack'
        },
        'hostname': 'xxxx',
        'vendor': {},
        'addresses': {
            'ipv4': 'x.x.x.x'
        },
        'tcp': {
            '443': {
                'product': 'Apache Tomcat/Coyote JSP engine',
                'name': 'http',
                'extrainfo': '',
                'reason': 'syn-ack',
                'cpe': '',
                'state': 'open',
                'version': '1.1',
                'conf': '10'
            },
            '80': {
                'product': '',
                'name': 'http',
                'extrainfo': '',
                'reason': 'conn-refused',
                'cpe': '',
                'state': 'closed',
                'version': '',
                'conf': '3'
            }
        }
    }
}]

4 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

>>> data = [{'x.x.x.x': {'status': {'state': 'up', 'reason': 'syn-ack'}, 'hostname': 'xxxx', 'vendor': {}, 'addresses': {'ipv4': 'x.x.x.x'}, 'tcp': {'443': {'product': 'Apache Tomcat/Coyote JSP engine', 'name': 'http', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': '', 'state': 'open', 'version': '1.1', 'conf': '10'}, '80': {'product': '', 'name': 'http', 'extrainfo': '', 'reason': 'conn-refused', 'cpe': '', 'state': 'closed', 'version': '', 'conf': '3'}}}}]
>>> for i in data[0]['x.x.x.x']['tcp']:
...     print i, data[0]['x.x.x.x']['tcp'][i]['product'], data[0]['x.x.x.x']['tcp'][i]['version']
... 
443 Apache Tomcat/Coyote JSP engine 1.1
80  
>>> 

答案 1 :(得分:0)

您可以使用方法items(Python 2中的iteritems)来提取端口号和相关信息:

In [4]: for port, info in data[0]['x.x.x.x']['tcp'].items():
   ...:     print(port, info['product'], info['version'])
   ...:   
443 Apache Tomcat/Coyote JSP engine 1.1
80  

答案 2 :(得分:0)

您始终可以使用d.keys()查看字典键中的内容以进行遍历。

    d = your dictionary

    d['x.x.x.x']['tcp']['443']['product']
    Out[109]: 'Apache Tomcat/Coyote JSP engine'

    d['x.x.x.x']['tcp']['443']['version']
    Out[110]: '1.1'

    d['x.x.x.x']['tcp']['80']['product']
    Out[109]: ''

    d['x.x.x.x']['tcp']['80']['version']
    Out[110]: ''

答案 3 :(得分:0)

您的数据基本上是一棵树,因此可以使用以下函数递归遍历:

def parse_data(output, keys_wanted, values_wanted, data):
    for key, val in data.iteritems():
        if key in keys_wanted:
            output.update({key: {k: val[k] for k in values_wanted}})
        if isinstance(val, dict):
            parse_data(output, keys_wanted, values_wanted, val)

使用:

data = <your dict>
keys = ['443', '80']
vals = ['product', 'version']
out = {}
parse_data(out, keys, vals, data)

输出:

>>> print out
{'443': {'product': 'Apache Tomcat/Coyote JSP engine', 'version': '1.1'}, '80': {'product': '', 'version': ''}}

此功能的一个好处是它的一般用途 - 如果你想要不同的键和值只是在参数中传递不同的列表。

顺便说一句,在您的示例输入中,dict位于列表中,但只有一个项目,所以为了简单起见,我删除了列表括号。如果您的实际数据位于包含许多其他项目的列表中,您当然希望在迭代循环中调用此函数。