簡體   English   中英

如何從python中的字典值獲取特定條目

[英]How to get particular entry from value of dictionary in python

在這里,這是我的字典的價值,但是我只想獲取產品和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'
            }
        }
    }
}]

您可以嘗試以下方法:

>>> 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  
>>> 

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

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  

您始終可以使用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]: ''

您的數據基本上是一棵樹,因此可以使用以下函數遞歸遍歷它:

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': ''}}

此功能的一個好處是它是通用的-如果您想要不同的鍵和值,只需在參數中傳遞不同的列表即可。

順便說一句,在您的示例輸入中,字典位於列表中,但是只有一項,因此為了簡單起見,我刪除了列表括號。 如果您的實際數據在包含許多其他項的列表中,那么您當然希望在迭代循環中調用此函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM