見出し画像

正規表現とfind_allを組み合わせてコンテンツを検索

今日は、『つくってマスターPython』の第5章で学んだことをアウトプットします。

正規表現で検索する

<<BeautifulSoup>>.find_all(re.compile(  パターン  ))
引数に正規表現オブジェクトを指定します。一般的にはre.compileを使い、正規表現オブジェクトを生成して利用します。

コンテンツを検索

<<BeautifulSoup>>.find_all(  text = テキスト  )
タグにコンテンツとしてテキストが用意されている場合、コンテンツのテキストを検索することもできます。例えば、<p>〇〇<p>とあった場合、〇〇の部分がコンテンツです。text引数を使うと、この部分が検索されます。

正規表現でコンテンツを検索するプログラム

<h1>~<h6>のテキストと、「Python」という文字列を含むテキストをすべて抜き出して表示する処理を作成します。

import re
import requests
from bs4 import BeautifulSoup

address = 'https://www.tuyano.com/index2?id=505001'
resp = requests.get(address)
data = resp.text

soup = BeautifulSoup(data, 'lxml')

for obj in soup.find_all(re.compile("^h[1~6]")):
   print(obj.name + ':' + obj.string)
   
for obj in soup.find_all(text=re.compile('Python')):
   print(obj.parent.name + ':' + obj)
1つ目のforでは、<h1>~<h6>のタグを取り出しています。re.compileを使い、正規表現で「’h’ + 1~6の整数」という名前のタグを取り出しています。そしてタグ名とともに、タグに設定されているコンテンツを表示しています。タグのコンテンツは、stringをいうメンバとして用意されています。

そっか!stringはメソッドではなく、メンバだったのか!!!

2つ目のforでは、”Python”を含む文字列を検索しています。textという名前付き引数を指定することで、タグの中身(コンテンツ)を検索できます。ここでは正規表現を使い、Pythonを含むコンテンツを取り出しています。
find_allメソッドのtext引数を使って取り出されるのは、タグではなく、タグに設定されたコンテンツです。これはTagクラスのインスタンス(Tagオブジェクト)ではなく、「NavigableString」というクラスのインスタンスとして取り出されます。NavigableStringは、Tagとは異なるクラスですが、Tagと同様にタグのツリー構造の中に組み込まれています。取得したNavigableStringインスタンスは、そのままprintすればコンテンツのテキストが表示されます。
また、今回のサンプルでは、obj.parent.nameという形で、コンテンツ(NavigableString)が組み込まれているタグの名前を表示しています。コンテンツというのは必ず何かのタグの中に組み込まれています。parentで、そのコンテンツが組み込まれているタグを取り出せます。


サポート、本当にありがとうございます。サポートしていただいた金額は、知的サイドハッスルとして取り組んでいる、個人研究の費用に充てさせていただきますね♪