【问题标题】:How to valid the captured incoming empty field in a table如何验证表中捕获的传入空字段
【发布时间】:2025-11-22 11:50:01
【问题描述】:

代码中的问题是,如果一个字段被遗漏,则会引发错误,如果我排除错误,则它不会显示任何内容

import pyshark
from tabulate import tabulate

capture = pyshark.FileCapture('/home/sipl/Downloads/DHCP.cap', display_filter='udp.port eq 67')
# capture2 = pyshark.LiveCapture(interface='wlo2', display_filter='arp')

d = dict()

for packet in capture:
    try:
        d['mac'] = packet.dhcp.hw_mac_addr
        d['hname'] = packet.dhcp.option_hostname

        d['vend'] = packet.dhcp.option_vendor_class_id
    except AttributeError:
        pass
    try:
        d['srvrid'] = packet.dhcp.option_dhcp_server_id
        d['smask'] = packet.dhcp.option_subnet_mask
        d['DNS'] = packet.dhcp.option_domain_name_server
        d['Domain'] = packet.dhcp.option_domain_name

    except AttributeError:
        pass
    try:
        d['ip'] = packet.dhcp.option_requested_ip_address

    except AttributeError:
        pass

    try:
        table = {'Mac': [d['mac']], 'IP': [d['ip']], 'host': [d['hname']],'vendor': [d['vend']], 'Server id': [d['srvrid']],
                 'Sub mask': [d['smask']], 'DNS': [d['dns']], 'Domain': [d['Domain']]}
        print(tabulate(table, headers='keys'))
    except KeyError:
        continue

我希望如果缺少一个字段,那么它将我收到的传入字段存储在一个数据包中并显示在表格中,对于空字段它不显示任何内容并将该字段留在表格中。 基本上我希望它存储传入字段并在表中打印,并且不会为丢失的字段引发错误。 我现在在 fileCapture 上尝试检查工作,但我需要在 liveCapture 上执行此操作

【问题讨论】:

    标签: python python-3.x dictionary pyshark tabulate


    【解决方案1】:

    如果我对你的理解正确,你不想得到属性错误,而是在字段缺失时输入一个空值。

    您可以通过使用getattr 函数检查值来做到这一点。

    所以我不知道 dhcp 到底是什么,以及它是否丢失或始终存在,只有后面的内容才会丢失。

    但是可以说 dhcp 始终存在,并且您指向的实际字段可能会丢失:

    1. 创建一个名为:get_value_or_none(obj, key, default='') -> str 的函数
    2. 现在让我们使用getattr 来实现它。
    def get_value(obj, key, default='') -> str:
        return getattr(obj, key, default=default)
    

    现在通过用函数调用包装调用来替换您在代码中所做的所有对应分配: 即:get_value(packet.dhcp, 'option_domain_name')

    就是这样,它应该可以工作。

    PS。如果dhcp 并不总是存在,您也必须对其执行相同的操作。

    【讨论】:

    • 我不明白该怎么做
    • 1.创建我上面建议的功能。 2.替换直接赋值,例如d['ip'] = packet.dhcp.option_requested_ip_address改为d['ip'] = get_value(packet.dhcp, 'option_requested_ip_address')
    【解决方案2】:

    我是用方法做到的:

    dictionary.get()
    

    【讨论】:

      最近更新 更多