#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])
# 株式会社パイソンホールディングス