ぷろぐら×でざいん

BeautifulSoupで複数タグを同時に指定する

BeautifulSoupで複数タグを同時に指定する

BeautifulSoupで複数タグを同時に指定する

要件

<dt>タグをKeyとして<dd>タグのValueを1つにまとめる。
<dt>タグが1に対して<dd>タグが1:1なら、別々に情報を取得しても問題がないが、仮に下記のように1:Nの場合は別々に取得し、データの整合性を合わせるのは難しい。
よって同時に取得し、上部のタグから順に取得し、データをまとめる方が効率が良い。今回は<dt><dd>を例にして取り上げているが、テーブルだとまた違った取り方ができるとは思います。

レクサス
クラウン
バイク ホンダ
トヨタ
ヤマハ

HTML


<div class="products">
	
<dl>
		
<dt>車</dt>

		
<dd>レクサス</dd>

		
<dd>クラウン</dd>


		
<dt>バイク</dt>

		
<dd>ホンダ</dd>

		
<dd>トヨタ</dd>

		
<dd>ヤマハ</dd>

	</dl>

</div>


ソースコード

from bs4 import BeautifulSoup
from collections import defaultdict

data = defaultdict(list)
soup = BeautifulSoup(HTML, 'html.parser')
product_div = soup.find('dl')
for product in product_div.find_all(['dt', 'dd']):
    if product.name == 'dt':
        key = product.text
    if key and product.name == 'dd':
        data[key].append(product.text)

print(data)


結果

data = {
    '車': ['レクサス', 'クラウン'],
    'バイク': ['ホンダ', 'トヨタ', 'ヤマハ']
}

あとがき

実はこの解決策に辿り着くまで紆余曲折があり、結構ハマりました。例えば、HTMLを1行、1行取得して、パースするなど。しかしそれだとなぜか上手くいかず。最終的には上記のように複数タグを同時に取得できるという機能に辿り着けたので、何とか欲しい挙動にはなりました。
しっかりとドキュメントを読み、このパッケージが何ができるのか、どのようなオブジェクトなのかという中身をしっかりと見るという作業は最終的には作業効率を向上させてくれますね。ただ、スクレイピングしたいページによって解決策は本当に千差万別ですので、上記の解決策より遥かにそのHTMLページにあった取り方が常にあるはずですので、参考程度に。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です