YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Text Nodeからデータが取り出せない

症状

typeを見るとDOM Text Nodeになってるインスタンスをdataプロパティを使ってデータを取り出そうとすると「NoneTypeだよ」的なエラーが出る。

状況

mixi API用のコードの中に出てくる。更新情報を取得する関数の中でのコードで起きるエラー。レスポンスのXMLはこんな感じ。

<?xml version="1.0" encoding="UTF-8">
<feed xmlns="http://www.w3.org/2005/Atom">
  <entry>
    <category scheme="http://mixi.jp/atom/ns#updates" label="マイミクシィ最新動画" term="video"/>
    <id>tag:mixi.jp,2007:updates-video-XXXXX-XXXXXXX</id>
    <link rel="alternate" href="http://video.mixi.jp/view_video.pl?owner_id=XXXXXX&amp;video_id=XXXXXXX" type="text/html"/>
    <title>ほげほげ</title>
    <summary/>
    <content><a href="http://video.mixi.jp/view_video.pl?owner_id=XXXXX&amp;video_id=XXXXXX">どうが</a> (ぱいそん)</content>
    <author>
      <name>ぱいそん</name>
      <uri>http://mixi.jp/show_friend.pl?id=XXXXX</uri>
    </author>
    <updated>2008-12-08T03:00:03Z</updated>
  </entry>
  <entry>
    <...>
  </entry>
</feed>

ここで、author要素の子要素のuri要素を取得しようとして

for n in doc.getElementsByTagName('entry'):
    uri = n.getElementsByTagName('author').item(0).\
          getElementsByTagName('uri').item(0).childNodes.item(0).data

とすると

AttributeError: 'NoneType' object has no attribute 'data'

とエラーが出る。だけどこのdataプロパティを消去した状態、つまり

for n in doc.getElementsByTagName('entry'):
    uri = n.getElementsByTagName('author').item(0).\
          getElementsByTagName('uri').item(0).childNodes.item(0) 

とすると表示は

<DOM Text Node "http://mix...">

となるわけです。あれ?Text Nodeじゃないですか!これはどうして?追調査が必要。