attakeiさん再び回答ありがとうございます。
だいぶスッキリとコードが書けるようになりました。
addressのdictのkeyの部分;
address.append({li.attrs.get('class')[0]: li.text})
はもっと綺麗に書く方法はないでしょうか?
liのclassを取得したいだけなのに
attrs.get('class')[0]
こういうのしか思い当たりませんでした。
これが最善であれば、このままベストアンサーにさせていただきます。
python
1profile = [] 2soup = BeautifulSoup(html, "html.parser") 3 4for div in soup.select(".profile"): 5 name = div.h3.text 6 hobby = [] 7 address = [] 8 for a in div.select('ul.hobby > li > a'): 9 hobby.append(a.text) 10 for li in div.select('ul.address > li'): 11 address.append({li.attrs.get('class')[0]: li.text}) 12 profile.append({"name": name, "hobby": hobby, "address": address}) 13 14print(profile)
python
1[ 2{'name': '山田太郎', 'hobby': ['サッカー', 'ドライブ'], 'address': [{'city': '東京都'}, {'ward': '新宿区'}, {'town': '西新宿'}]}, 3{'name': '鈴木花子', 'hobby': ['手芸', '料理', '旅行'], 'address': [{'city': '大阪市'}, {'ward': '中央区'}]} 4]
attakeiさん回答ありがとうございます。
追加で質問させてください。
ul要素が複数あった場合、最初の要素は取れましたが、
二つ目以降の取り方がわかりませんでした。
下のコードで取れたデータ:
[{'name': '山田太郎', 'hobby': ['サッカー', 'ドライブ']},
{'name': '鈴木花子', 'hobby': ['手芸', '料理', '旅行']}]
期待する出力は:
[{'name': '山田太郎', 'hobby': ['サッカー', 'ドライブ'], 'address': [{'city': "東京都"}, {'ward': "新宿区"}, {'town': "西新宿"}]},
{'name': '鈴木花子', 'hobby': ['手芸', '料理', '旅行'], 'address': [{'city': "大阪市',}, {'ward': '中央区'}]}]
html = """
<div class="profile"> <h3>山田太郎</h3> <ul class="hobby"> <li><a href="#">サッカー</a></li> <li><a href="#">ドライブ</a></li> </ul> <ul class="address"> <li class="city">東京都</li> <li class="ward">新宿区</li> <li class="town">西新宿</li> </ul> </div> <div class="profile"> <h3>鈴木花子</h3> <ul class="hobby"> <li><a href="#">手芸</a></li> <li><a href="#">料理</a></li> <li><a href="#">旅行</a></li> </ul> <ul class="address"> <li class="city">大阪市</li> <li class="ward">中央区</li> </ul> </div> """ profile = [] soup = BeautifulSoup(html, "html.parser") for div in soup.select(".profile"): name = div.h3.text hobby = [] for a in div.ul.findChildren("a"): hobby.append(a.text) profile.append({"name": name, "hobby": hobby}) print(profile)==============前回の質問==============
例えば下のようなHTMLがあっとして、二人のプロフィールを次のようなjson形式で保存したいと考えています。
{[name: "山田太郎", comment: "よろしくお願いします", age: 26, address: "東京都"], [name: "鈴木花子", comment: "よろしくお願いします", age: 20, address: "大阪府"]}
html = """
<div class="profile"> <h3>山田太郎<h3> <p>よろしくおねがいします</p> <ul> <li>26歳</li> <li>東京都</li> </ul> </div> <div class="profile"> <h3>鈴木花子<h3> <p>よろしくおねがいします</p> <ul> <li>20歳</li> <li>大阪府</li> </ul> </div> """ soup = BeautifulSoup(html, "html.parser")試したこと:
for name in soup.select(".profile > h3")
print(name.text)
こうすると山田太郎と山田花子の名前を取れますが、
あとの年齢、都道府県を名前と紐付けた形で取得できません。
なにかいい方法はありませんでしょうか?
回答3件
あなたの回答
tips
プレビュー