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’…
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’…
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
以上でおしまいです。