前提・実現したいこと
非エンジニア、Python初心者です。
こちらへの投稿も初めてですので、質問の仕方等不備があればご指摘いただけるとありがたいです。
Python・BeaurifulSoupを利用したWebスクレイピングでHTML内の漢字と読みの情報を取り出そうとしています。
HTML
1<span class="yomi">あつ<span class="okurigana">める</span></span>
となっている部分から「あつ」と「める」を別々に取り出し、送り仮名がないものについては空白を取得したいです。
発生している問題
soup.selectでCSSセレクタを指定して特定の情報を取り出したのですが、入れ子になった別々のタグの要素が結合されて取得されてしまいます。
希望する出力結果:
鳩
['はと', 'あつ', 'あつ', 'やす']
['', 'める', 'まる', 'んずる']
実際の出力結果:
鳩
['はと', 'あつめる', 'あつまる', 'やすんずる']
['める', 'まる', 'んずる']
該当のソースコード
HTML
1 <div class="kanji"> 2 <span class="text">鳩</span> 3 </div> 4(省略) 5 <div class="reads"> 6 <dl> 7(省略) 8 <dt>訓読み</dt> 9 <dd> <span class="yomi">はと</span>・ 10 <span class="yomi">あつ<span class="okurigana">める</span></span>・ 11 <span class="yomi">あつ<span class="okurigana">まる</span></span>・ 12 <span class="yomi">やす<span class="okurigana">んずる</span></span> 13 </dd> 14 </dl> 15 </div>
Python
1import requests 2from bs4 import BeautifulSoup 3 4url = 'https://www.xxxxxx.xxx/' 5response = requests.get(url) 6soup = BeautifulSoup(response.text, 'lxml') 7 8kanji = soup.select_one('.kanji > .text').text 9yomi_kun = [tag.text for tag in soup.select('div.reads > dl > dd:nth-of-type(2) > span.yomi')] 10okurigana = okurigana = [tag.text for tag in soup.select('div.reads > dl > dd:nth-of-type(2) > span.yomi > span.okurigana')] 11print(kanji) 12print(yomi_kun) 13print(okurigana) 14 15# 出力結果: 16# 鳩 17# ['はと', 'あつめる', 'あつまる', 'やすんずる'] 18# ['める', 'まる', 'んずる']
試したこと
行き詰まってしまい、解決策を思いつくことができませんでした。正規表現を使ったりするのでしょうか。
補足情報(FW/ツールのバージョンなど)
Mac OS 11.6
Google colaboratory 上で作業しています。
Python 3.7.12
BeautifulSoup4 4.6.3
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/03 09:39