概要
- divのみで情報が収納されているhtml(一部分)からtextを抽出したい
- div群の深さ・並列数など構造が可変であり位置指定は難しい
- かろうじて「最上層のdivは大項目」「最下層のdivは個別要素」というルールは信頼できそう
- 最上層divの内部にいくつの最下層divがあるかはまちまち
- 各最下層divのdiv深さは3だったり4だったりまちまち
このクソ構造を作ったのは誰だァ!
- Beautifulsoupで最上層divおよび可変深さの最下層divを抽出する方法のメモ
詳細
最上層div
-
soup.find_all('div', recursive=False)
で最上層のdivのみ抽出できるらしいが、私の環境では機能しなかった - htmlの一部分からsoupを作成する際にはbodyタグが全体を囲うように付与される
-
divtops = soup.select('body>div')
でbodyタグ直下のdiv(必然的に最上層)のみを抽出できた
最下層div
- 最上層divをdivtopとする
-
divdiv = divtop.find_all('div')
でdivtop内の全てのdivタグを拾ってくる -
divbtms = list(filter(lambda x: len(x.find_all('div')) == 0, divdiv))
で、その下に更にdivタグを持たないdivタグ=最下層のdivタグを抽出
その他
- divtopsはtype:
class bs4.element.ResultSet
(要素はtype:class 'bs4.element.Tag'
) - divbtmsはtypeがlistになってしまっている(要素はtype:
class 'bs4.element.Tag'
) - typeが変更になってしまうのはモヤモヤする、もっとスマートな方法が絶対にある気がする……