2014-07-01 4 views
1

J'ai sorti et couper une partie d'une source XML à partir NVD et ci-dessous est l'extrait:Python: Obtenir des valeurs de nœuds et des attributs à l'aide lxml + objectiver + findall ou fromstring

<?xml version='1.0' encoding='UTF-8'?> 
<nvd xmlns="http://nvd.nist.gov/feeds/cve/1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nvd.nist.gov/feeds/cve/1.2 http://nvd.nist.gov/schema/nvdcve.xsd" pub_date="2014-07-01" nvd_xml_version="1.2"> 
    <entry CVSS_base_score="6.4" CVSS_exploit_subscore="10.0" CVSS_impact_subscore="4.9" CVSS_score="6.4" CVSS_vector="(AV:N/AC:L/Au:N/C:P/I:P/A:N)" CVSS_version="2.0" modified="2014-06-30" name="CVE-2011-1381" published="2014-06-27" seq="2011-1381" severity="Medium" type="CVE"> 
     <desc> 
     <descript source="cve">Unspecified vulnerability in IBM OpenPages GRC Platform 6.1.0.1 before IF4 allows remote attackers to bypass intended access restrictions via unknown vectors.</descript> 
     </desc> 
    </entry> 
    <entry CVSS_base_score="3.5" CVSS_exploit_subscore="6.8" CVSS_impact_subscore="2.9" CVSS_score="3.5" CVSS_vector="(AV:N/AC:M/Au:S/C:P/I:N/A:N)" CVSS_version="2.0" modified="2014-06-30" name="CVE-2014-4669" published="2014-06-28" seq="2014-4669" severity="Low" type="CVE"> 
     <desc> 
     <descript source="cve">HP Enterprise Maps 1.00 allows remote authenticated users to read arbitrary files via a WSDL document containing an XML external entity declaration in conjunction with an entity reference within a GetQuote operation, related to an XML External Entity (XXE) issue.</descript> 
     </desc> 
    </entry> 
</nvd> 

Comme mentionné sur le titre de cette question et pour l'extrait ci-dessus, Je veux juste obtenir la valeur et l'attribut du nœud 'descript'. J'ai essayé d'utiliser la méthode de findall mais il est de retour une liste vide:

root = etree.fromstring(open("c:/temp/CVE/sample.xml").read()).getroottree().getroot() 
root.findall('entry') 

Ce retour:

[] 

Lorsque j'imprime l'étiquette de la racine, voici ce qu'il retourne:

'{http://nvd.nist.gov/feeds/cve/1.2}nvd' 

J'ai également essayé d'imprimer les étiquettes du parent immédiat et de ses enfants:

for e in root.iterchildren(): 
print "Immediate parent : %s" % e.tag 
children = e.getchildren() 
for c in children : print "\t\tchildren : %s" % c.tag 

Voici ce qu'il retourne:

Immediate parent : {http://nvd.nist.gov/feeds/cve/1.2}entry 
    children : {http://nvd.nist.gov/feeds/cve/1.2}desc 
Immediate parent : {http://nvd.nist.gov/feeds/cve/1.2}entry 
    children : {http://nvd.nist.gov/feeds/cve/1.2}desc 

Encore une fois, ce que je veux juste est d'obtenir la attrib et la valeur du noeud « descript ». Toutes les idées sont grandement appréciées. Merci d'avance!

Répondre

1

Vous devez ajouter des préfixes d'espace de noms dans l'expression XPath:

tree = etree.fromstring(open("c:/temp/CVE/sample.xml").read()).getroottree().getroot() 
for descript in tree.xpath('//ns:entry/ns:desc/ns:descript', namespaces={'ns': 'http://nvd.nist.gov/feeds/cve/1.2'}): 
    print descript.text 
    print descript.attrib.get('source') 

Prints:

Unspecified vulnerability in IBM OpenPages GRC Platform 6.1.0.1 before IF4 allows remote attackers to bypass intended access restrictions via unknown vectors. 
cve 
HP Enterprise Maps 1.00 allows remote authenticated users to read arbitrary files via a WSDL document containing an XML external entity declaration in conjunction with an entity reference within a GetQuote operation, related to an XML External Entity (XXE) issue. 
cve 

Voir aussi ce fil pertinent:

+0

Merci beaucoup. A travaillé pour moi – jaysonpryde

Questions connexes