【Python】XPathでXMLから特定の文字列を抽出 (JVNDB識別子 -> CVE識別子変換)

【bash】JVNDB識別子 -> CVE識別子 変換 | hacknote のPython版です。

HTMLをXPathでごちゃごちゃする場合と異なって? XMLの場合は名前空間(xmlns:vuldef="http://jvn.jp/vuldef/" のような感じで、対象XMLのヘッダあたりに定義されているやつ)を明示的に指定してあげなければアカンのです。 (ここではvuldefを指定。)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# pipで要インストール
# pip install lxml urllib3

from lxml import etree
import urllib3

from StringIO import StringIO

response = urllib3.PoolManager().request('GET', "http://jvndb.jvn.jp/myjvn?method=getVulnDetailInfo&vulnId=JVNDB-2016-002463").data
f = StringIO(response)
doc = etree.parse(f)
selection = doc.xpath(
    "//vuldef:RelatedItem[@type='advisory' and .//vuldef:Name[contains(text(),'NVD')]]/vuldef:VulinfoID/text()",
    namespaces = {
        'vuldef': "http://jvn.jp/vuldef/"
    }
)
print(selection[0])

# => CVE-2016-3074