オープンデータとプログラミング

Tag Archive for python 2.7

pythonでXMLをパースするときに出る2つのエラーの解決方法

python

pythonでXMLをパースしようとしたときに出くわすエラー2つについて修正方法をメモしておきます。

エラー1
IOError: [Errno 2] No such file or directory: u'<?xml version=”1.0″ encoding=”UTF-8″?> …

エラー2
root = tree.getroot()
AttributeError: ‘Element’ object has no attribute ‘getroot’…

次のソースはよくネットにサンプルとしてよく見かけるコードですが、5行目のところでエラー1がでます。

import xml.etree.ElementTree as ET

req = …(省略) #postした結果XMLが返却されるとする

tree = ET.parse(req.text)  #エラー1
root = tree.getroot() 

#hogehogeを検索
ret=root.find(".//hogehoge").text

req.textにはXMLが入っていますが、これがファイル名だと思われてしまうからですね。
そのため、No such file or directoryと怒られるわけです。
なのでエラーメッセージには、u'<?xml version=”1.0″ encoding=”UTF-8″?> …のようにXMLの内容が表示されています。
parseには、ファイルのパスを渡す必要があります。

IOError: [Errno 2] No such file or directory: u'<?xml version=”1.0″ encoding=”UTF-8″?> …

XMLの文字列をパースする場合には、以下のようにfromstringを使用します。

import xml.etree.ElementTree as ET

req = …(省略) #postした結果XMLが返却されるとする

tree = ET.fromstring(req.text.encode('utf-8'))  #エラー1が解消します
root = tree.getroot()                           #今度はここでエラー2

#hogehogeを検索
ret=root.find(".//hogehoge").text

5行目のエラーが解消されてメデタシメデタシなのですが、今度は6行目でエラーになります。

root = tree.getroot()
AttributeError: ‘Element’ object has no attribute ‘getroot’…

今度は、getrootがないと怒られます。
こちらは次のように修正します。

import xml.etree.ElementTree as ET

req = …(省略) #postした結果XMLが返却されるとする

root = ET.fromstring(req.text.encode('utf-8'))

#hogehogeを検索
ret=root.find(".//hogehoge").text

以上でおしまいです。