Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ElementTree find() always returns None

I'm using ElementTree with Python to parse an XML file to find the contents of a subchild

This is the XML file I'm trying to parse:

<?xml version='1.0' encoding='UTF-8'?>
<nvd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nvd.nist.gov/feeds/cve/1.2" nvd_xml_version="1.2" pub_date="2016-02-10" xsi:schemaLocation="http://nvd.nist.gov/feeds/cve/1.2  http://nvd.nist.gov/schema/nvdcve_1.2.1.xsd">
  <entry type="CVE" name="CVE-1999-0001" seq="1999-0001" published="1999-12-30" modified="2010-12-16" severity="Medium" CVSS_version="2.0" CVSS_score="5.0" CVSS_base_score="5.0" CVSS_impact_subscore="2.9" CVSS_exploit_subscore="10.0" CVSS_vector="(AV:N/AC:L/Au:N/C:N/I:N/A:P)">
    <desc>
      <descript source="cve">ip_input.c in BSD-derived TCP/IP implementations allows remote attackers to cause a denial of service (crash or hang) via crafted packets.</descript>
    </desc>
    <loss_types>
      <avail/>
    </loss_types>
    <range>
      <network/>
    </range>
    <refs>
      <ref source="OSVDB" url="http://www.osvdb.org/5707">5707</ref>
      <ref source="CONFIRM" url="http://www.openbsd.org/errata23.html#tcpfix">http://www.openbsd.org/errata23.html#tcpfix</ref>
    </refs>

this is my code:

import xml.etree.ElementTree as ET

if __name__ == '__main__':
  tree = ET.parse('nvdcve-modified.xml')
  root = tree.getroot()

  print root.find('entry')
  print root[0].find('desc')

the output for both lines in None

like image 607
Salman Morshed Avatar asked Dec 19 '22 18:12

Salman Morshed


1 Answers

Your XML has default namespace defined at the root element level :

xmlns="http://nvd.nist.gov/feeds/cve/1.2"

Descendant elements without prefix inherits ancestor's default namespace implicitly. To find element in namespace, you can map a prefix to the namespace URI and use the prefix like so :

ns = {'d': 'http://nvd.nist.gov/feeds/cve/1.2'}
root.find('d:entry', ns)

or use the namespace URI directly :

root.find('{http://nvd.nist.gov/feeds/cve/1.2}entry')
like image 65
har07 Avatar answered Dec 21 '22 11:12

har07