Google App Engine for PythonでXMLの解析。
何箇所かでつまずいて泣きそうになった。解決まで6時間くらいかかった。
最初に見つけたのはElementTreeというものを使う方法。
最初は凄く簡単にXMLの解析ができるので感動していたけど、エラーが出て解析できないものに遭遇。
なので次にBeautifulSoupというものを使った。BeautifulSoupを使うと上手く行ったけど、BeautifulSoupでも解析できない場合があったので再びElementTreeへ戻りいろいろ調べてやっと解決。
つまづいたのは、findall(‘//名前’)のようにして、全て検索する場合。なぜかうまくいかない場合があった。
なので、ツリーを順番に上からたどってあげると上手く行った。
以下一部
from xml.etree.ElementTree import XML, ElementTree, Element
import urllib
import urllib2
まず上の3つを使うので読み込んでおく。全部最初から揃ってるらしいので上の3行を書くだけでOKらしい
url = “http://~”
xml = ElementTree(file=urllib2.urlopen(url))
root =xml.getroot()
次にURLを読み込み、ElementTreeのオブジェクト?にして、getroot()でルートに移動。
for find in root.getiterator():
if’entry’ in find.tag:
for id_find in find.getiterator():
if’id’ in id_find.tag:
self.response.out.write(id_find.text)
この部分で必要な情報をXMLから取り出す。(コピペしたらタブが消えてる)
getiterator()は全ての要素をゲットするのでforで回転させる。
次に、ifを使い、例えばentryという要素を見つけた場合は、entryより下の要素をgetiterator()ですべて取り出す。
要素名はfind.tagのようにして取り出せるので、これで判別する。
次にentryの下にある、例えばidという属性の中身を取り出したい場合は、if’id’ in id_find.tag:として
self.response.out.write(id_find.text.encode(‘UTF-8’))で書きだす。
.encode(‘UTF-8’)を付けないと日本語が入る場合エラーが出るみたい。基本的に全部.encode(‘UTF-8’)を付けるようにしてる。
こうやってXMLを使ってみたんだけど、凄く面倒なことをしてる気もする、findall(‘//名前’)やgetiterator(”名前”)で上手くいけばかなり楽なのになぜかエラーが出るので
取り敢えずこれで済ませる。