XMLをパースして辞書にしてリストの入れ子にする
たぶんもっとスマートなやり方があるとおもう
結果的に作りたかったのはこんな感じ
[ {aaa:bbb, ccc:ddd} {eee:fff, ggg,hhh} ...... ]
おれにはうまく思いつかなかったんや。ゴリ押しの方法。
DjangoのViews.pyです
#AmazonAPIをセットする外部関数 api = Amazon().setAWSAPI() #フォームでとってきたデータからリクエストを生成する。まあ本質ではない if form.cleaned_data['media_type'] == "1": #CD if form.cleaned_data['name_or_title_type'] == "1": #name items = api.ItemSearch(SearchIndex="Music", Artist=form.cleaned_data["query"]) elif form.cleaned_data['name_or_title_type'] == "2": #title items = api.ItemSearch(SearchIndex="Music", Title=form.cleaned_data["query"]) elif form.cleaned_data['media_type'] == "2": #DVD if form.cleaned_data['name_or_title_type'] == "1": #name items = api.ItemSearch(SearchIndex="DVD", Keywords=form.cleaned_data["query"]) elif form.cleaned_data['name_or_title_type'] == "2": #title items = api.ItemSearch(SearchIndex="DVD", Title=form.cleaned_data["query"]) elif form.cleaned_data['media_type'] == "3": #LiveHouse pass else: pass #XMLのパースにはBeautifulSoupにたよった soup = BeautifulSoup(items) #問題はここから #結果はリストの入れ物にする result = [] for item_soup in soup("item"): #初期化用の辞書をつくっておく item_dict = {} #findAll()でイテレートっぽい感じに走査 for item in item_soup.findAll(): #dict.updateで辞書を連結する。辞書の中身はitem.name, item.textをいれておく #nameはXMLの属性、textはXMLの属性の中身です item_dict.update(dict([(item.name, item.text)])) #リストに連結する result.append(item_dict) return result
dict.updateがつかえるっぽい。dict.updateで連結しないと要素すべてを取得できない。
けどなぁ
ほんとはeTreeとかlxmlとかそこらへんつかってやるべきなのかなぁ。そもそもなんかモデルにもたせたりしたほうがいいのかなぁ。今回は検索結果を辞書にして渡したかったからこうしたのだけど、ちょっと微妙感はある。