1

lxml を使用して Python で XML ファイルを解析しようとしていますが、基本的な試行でエラーが発生します。この投稿lxml チュートリアルを使用してブートストラップします。

私の XML ファイルは、基本的に以下のレコードから構築されています (読みやすいようにトリミングしています)。

<?xml version="1.0" ?>
<?xml-stylesheet href="file:///usr/share/nmap/nmap.xsl" type="text/xsl"?>
<nmaprun scanner="nmap" args="nmap -sV -p135,12345 -oX 10.232.0.0.16.xml 10.232.0.0/16" start="1340201347" startstr="Wed Jun 20 16:09:07 2012" version="5.21" xmloutputversion="1.03">
<host>
  <hostnames>
    <hostname name="host1.example.com" type="PTR"/>
  </hostnames>
</host>
</nmaprun>

この複雑なスクリプトを実行します。

from lxml import etree

d = etree.parse("myfile.xml")
for host in d.findall("host"):
    aa = host.find("hostnames/hostname")
    print aa.attrib["name"]

私は電話に出AttributeError: 'NoneType' object has no attribute 'attrib'ますprintdの値を確認しhostaaそれらはすべて要素として定義されています。

これが明らかな場合は、事前にお詫び申し上げます (おそらくそうです)。

EDIT:要求に応じてXMLファイルのヘッダーを追加しました(私はまだ回答を読んで読み直しています:))

ありがとう!

4

3 に答える 3

2

これは、xpath式を使用して解決できます。

d.xpath('//hostname/@name') # thank you for comment

あるいは

for host in d.xpath('//hostname'):
    print host.get('name'), host.get('whatever else etc...')
于 2012-06-20T16:07:02.757 に答える
1

XPath を使用する方が理にかなっていますが、ホストにホスト名が見つからない場合を処理する限り、単独で立っている場合でもコードは正常に動作します。

doc = lxml.etree.XML("""
  <nmaprun>
    <host>
      <hostnames>
        <hostname name="host1.example.com" type="PTR"/>
      </hostnames>
    </host>
  </nmaprun>""")
for host in doc.findall('host'):
  host_el = host.find('hostnames/hostname')
  if host_el is not None:
    print host_el.attrib['name']

XPath ( ordoc.xpath()ではなく) を使用すると、名前を持つホスト名のみをフィルタリングして、不完全なレコードを完全に回避することができます。doc.find()doc.findall()

  • host[hostnames/hostname/@name]aa属性を持つhostが少なくとも 1つあるを検索します。hostnameshostnamename
  • //hostnames/hostname/@name名前自体のみを直接返します ( を使用している場合はlxml、これらを文字列として公開します)。
于 2012-06-20T16:18:23.700 に答える
1

サブ要素が定​​義されていない、または定義され<host>ていない要素があるようです。<hostnames><hostname>

@Charles Duffy による質問へのコメントで示唆されているように、呼び出しがfind()要素を見つけたことを確認する必要があります。

for host in d.findall("host"):
    aa = host.find("hostnames/hostname")
    if aa:
        print aa.attrib["name"]
于 2012-06-20T16:21:48.610 に答える