pyhon
BeautifulSoup
Webスクレイピング

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

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