Edited at

BeautifulSoupを利用して取得したデータの、下層の不要なタグを除去する方法

More than 1 year has passed since last update.


BeautifulSoupを利用して取得したデータの、下層の不要なタグを除去する方法

BeautifulSoupを利用して取得したデータが、不要なタグまみれだというケースは多々あるかと思います。

idやclassが指定されていれば除去は大変ではないのですが、特にid、classが指定されていないページも未だに多いです。

例えばこんな場合

text = '' \

'<div id="title">' \
'<span>株式会社パイソンホールディングス' \
'<span>[東京都]' \
'<span>(港区)</span>' \
'</span>' \
'</span>' \
'</div>'

企業名のみ取得したいところですが、spanタグが入れ子になっていてなかなか思うようにいきません。

from bs4 import BeautifulSoup

text = '' \
'<div id="title">' \
'<span>株式会社パイソンホールディングス' \
'<span>[東京都]' \
'<span>(港区)</span>' \
'</span>' \
'</span>' \
'</div>'

bsobj = BeautifulSoup(text, 'lxml')
company_name = bsobj.find('span')

print(company_name)
# <span>株式会社パイソンホールディングス<span>[東京都]<span>(港区)</span></span></span>

print(company_name.text)
# 株式会社パイソンホールディングス[東京都](港区)

.contentsを利用すると取得したタグと、下層のタグを切り分けてくれます。

ですので、.contents[0]を利用すれば、不要な下層タグを除去したデータを取得できます。

from bs4 import BeautifulSoup

text = '' \
'<div id="title">' \
'<span>株式会社パイソンホールディングス' \
'<span>[東京都]' \
'<span>(港区)</span>' \
'</span>' \
'</span>' \
'</div>'

bsobj = BeautifulSoup(text, 'lxml')
company_name = bsobj.find('span')

print(company_name.contents)
# ['株式会社パイソンホールディングス', <span>[東京都]<span>(港区)</span></span>]

print(company_name.contents[0])
# 株式会社パイソンホールディングス