2014-12-15 5 views
0

Я следующий Nmap вывод, в формате XML:Извлечение данных из формата XML в Python

<ports><extraports state="closed" count="991"> 
<extrareasons reason="conn-refused" count="991"/> 
</extraports> 
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port> 
<port protocol="tcp" portid="25"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="smtp" method="table" conf="3"/></port> 
<port protocol="tcp" portid="139"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="netbios-ssn" method="table" conf="3"/></port> 
<port protocol="tcp" portid="443"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="https" method="table" conf="3"/></port> 

Я хочу, чтобы получить номера портов, которые открыты:

print 'Port Number: '+host.find('ports').find('port').get('portid') 

Но результат просто 22 ,

Как я могу получить результаты:

22 
25 
139 
443 

ответ

1

Найти все port элементы и получить portid атрибуты.

Использование Element.findall и list comprehension:

>>> import xml.etree.ElementTree as ET 
>>> root = ET.fromstring(''' 
<ports><extraports state="closed" count="991"> 
<extrareasons reason="conn-refused" count="991"/> 
</extraports> 
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port> 
<port protocol="tcp" portid="25"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="smtp" method="table" conf="3"/></port> 
<port protocol="tcp" portid="139"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="netbios-ssn" method="table" conf="3"/></port> 
<port protocol="tcp" portid="443"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="https" method="table" conf="3"/></port> 
</ports> 
''') 
>>> [port.get('portid') for port in root.findall('.//port')] 
['22', '25', '139', '443'] 
+0

Большое спасибо :) – MLSC

+0

@MortezaLSC, итерируем 'port' элементы:' для порта в root.findall ('.// порт'): печать ('port: {}'. format (port.get ('portid'))) ' – falsetru

+0

Мне очень жаль ... но я' state = [port.get ('state') для состояния в root.findall ('.// port')] 'для проверки состояний, а затем он не возвращает меня' open' и говорит 'none' – MLSC

Смежные вопросы