読者です 読者をやめる 読者になる 読者になる

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とかそこらへんつかってやるべきなのかなぁ。そもそもなんかモデルにもたせたりしたほうがいいのかなぁ。今回は検索結果を辞書にして渡したかったからこうしたのだけど、ちょっと微妙感はある。

広告を非表示にする