如何使用 ElementTree 在 Python 中将 XML 表划分为数组

How to divide XML tables into arrays with in Python with ElementTree

我尝试将 nmap 的 xml 输出分成数组。 nmap 脚本扫描端口的 ssh 密码,我的 python 脚本的目标是将 nmap 输出过滤为不安全的密码。 xml 输出如下所示:

<host>
    <ports>
        <port>
            <script>
                <table key="kex_algorithms">
                    <elem>curve25519-sha256</elem>
                    <elem>curve25519-sha256@libssh.org</elem>
                    <elem>ecdh-sha2-nistp256</elem>
                    <elem>ecdh-sha2-nistp384</elem>
                    <elem>ecdh-sha2-nistp521</elem>
                    <elem>diffie-hellman-group-exchange-sha256</elem>
                    <elem>diffie-hellman-group16-sha512</elem>
                    <elem>diffie-hellman-group18-sha512</elem>
                    <elem>diffie-hellman-group14-sha256</elem>
                    <elem>diffie-hellman-group14-sha1</elem>
                </table>
                <table key="server_host_key_algorithms">
                    <elem>rsa-sha2-512</elem>
                    <elem>rsa-sha2-256</elem>
                    <elem>ssh-rsa</elem>
                    <elem>ecdsa-sha2-nistp256</elem>
                    <elem>ssh-ed25519</elem>
                </table>
                <table key="encryption_algorithms">
                    <elem>chacha20-poly1305@openssh.com</elem>
                    <elem>aes128-ctr</elem>
                    <elem>aes192-ctr</elem>
                    <elem>aes256-ctr</elem>
                    <elem>aes128-gcm@openssh.com</elem>
                    <elem>aes256-gcm@openssh.com</elem>
                </table>
                <table key="mac_algorithms">
                    <elem>umac-64-etm@openssh.com</elem>
                    <elem>umac-128-etm@openssh.com</elem>
                    <elem>hmac-sha2-256-etm@openssh.com</elem>
                    <elem>hmac-sha2-512-etm@openssh.com</elem>
                    <elem>hmac-sha1-etm@openssh.com</elem>
                    <elem>umac-64@openssh.com</elem>
                    <elem>umac-128@openssh.com</elem>
                    <elem>hmac-sha2-256</elem>
                    <elem>hmac-sha2-512</elem>
                    <elem>hmac-sha1</elem>
                </table>
                    <table key="compression_algorithms">
                    <elem>none</elem>
                    <elem>zlib@openssh.com</elem>
                </table>
            </script>
        </port> 
    </ports>
</host>

我当前的python代码:

# create element tree object
tree = ET.parse(xmlfile)

# get root element
root = tree.getroot()

# create new arrays
keyx_alg = []
encr_alg = []
mac_alg = []
hkey_alg = []
comp_alg = []


for child in root.findall('host'):
    for gchild in child.findall('ports'):
        for ggchild in gchild.findall('port'):
            for gggchild in ggchild.findall('script'):
                for ggggchild in gggchild.findall('table'):
                    # iterate through the table an append the content into the array
                    # e.g.: iterate trough the table with key="kex_algorithms" and append the content into the array "keyx_alg"

我不知道如何将表格放入相应的数组中。也许你们中有人知道解决方案。

见下文(代码将表数据收集到字典中)

import xml.etree.ElementTree as ET

xml = '''<host>
    <ports>
        <port>
            <script>
                <table key="kex_algorithms">
                    <elem>curve25519-sha256</elem>
                    <elem>curve25519-sha256@libssh.org</elem>
                    <elem>ecdh-sha2-nistp256</elem>
                    <elem>ecdh-sha2-nistp384</elem>
                    <elem>ecdh-sha2-nistp521</elem>
                    <elem>diffie-hellman-group-exchange-sha256</elem>
                    <elem>diffie-hellman-group16-sha512</elem>
                    <elem>diffie-hellman-group18-sha512</elem>
                    <elem>diffie-hellman-group14-sha256</elem>
                    <elem>diffie-hellman-group14-sha1</elem>
                </table>
                <table key="server_host_key_algorithms">
                    <elem>rsa-sha2-512</elem>
                    <elem>rsa-sha2-256</elem>
                    <elem>ssh-rsa</elem>
                    <elem>ecdsa-sha2-nistp256</elem>
                    <elem>ssh-ed25519</elem>
                </table>
                <table key="encryption_algorithms">
                    <elem>chacha20-poly1305@openssh.com</elem>
                    <elem>aes128-ctr</elem>
                    <elem>aes192-ctr</elem>
                    <elem>aes256-ctr</elem>
                    <elem>aes128-gcm@openssh.com</elem>
                    <elem>aes256-gcm@openssh.com</elem>
                </table>
                <table key="mac_algorithms">
                    <elem>umac-64-etm@openssh.com</elem>
                    <elem>umac-128-etm@openssh.com</elem>
                    <elem>hmac-sha2-256-etm@openssh.com</elem>
                    <elem>hmac-sha2-512-etm@openssh.com</elem>
                    <elem>hmac-sha1-etm@openssh.com</elem>
                    <elem>umac-64@openssh.com</elem>
                    <elem>umac-128@openssh.com</elem>
                    <elem>hmac-sha2-256</elem>
                    <elem>hmac-sha2-512</elem>
                    <elem>hmac-sha1</elem>
                </table>
                    <table key="compression_algorithms">
                    <elem>none</elem>
                    <elem>zlib@openssh.com</elem>
                </table>
            </script>
        </port> 
    </ports>
</host>'''

data = {}
root = ET.fromstring(xml)
for table in root.findall('.//table'):
    data[table.attrib['key']] = [e.text for e in table.findall('elem')]

for k, v in data.items():
    print(f'{k} --> {v}')

输出

kex_algorithms --> ['curve25519-sha256', 'curve25519-sha256@libssh.org', 'ecdh-sha2-nistp256', 'ecdh-sha2-nistp384', 'ecdh-sha2-nistp521', 'diffie-hellman-group-exchange-sha256', 'diffie-hellman-group16-sha512', 'diffie-hellman-group18-sha512', 'diffie-hellman-group14-sha256', 'diffie-hellman-group14-sha1']
server_host_key_algorithms --> ['rsa-sha2-512', 'rsa-sha2-256', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ssh-ed25519']
encryption_algorithms --> ['chacha20-poly1305@openssh.com', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-gcm@openssh.com', 'aes256-gcm@openssh.com']
mac_algorithms --> ['umac-64-etm@openssh.com', 'umac-128-etm@openssh.com', 'hmac-sha2-256-etm@openssh.com', 'hmac-sha2-512-etm@openssh.com', 'hmac-sha1-etm@openssh.com', 'umac-64@openssh.com', 'umac-128@openssh.com', 'hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1']
compression_algorithms --> ['none', 'zlib@openssh.com']