ユーニックス総合研究所

  • home
  • archives
  • python-beautifulsoup-find-text

PythonのBeautifulSoup4でtextをfindする【テキストを取得する】

  • 作成日: 2022-03-24
  • 更新日: 2023-12-26
  • カテゴリ: Python

PythonのBeautifulSoup4でtextをfindする

Pythonの外部ライブラリであるBeautifulSoup4を使うとHTMLやXMLを簡単にパースできます。
スクレイピングなどで、特定の要素のテキスト内容を取得したい場合などがあります。

そういう時はBeautifulSoup4でタグをfindして、そのfindしたタグのテキストを得ます。
あるいはfindのtext引数にテキストを指定して、そのテキストを持ったタグを取ります。
この方法を覚えておくとスクレイピングなどがはかどります。

この記事ではBeautifulSoup4でテキストをfindする方法を解説します。

関連記事

【Python】BeautifulSoup4のfind()の使い方をわかりやすく解説
PythonのBeautifulSoup4でtextをfindする【テキストを取得する】
BeautifulSoup4の削除系のメソッドを3つ紹介
BeautifulSoup4のtextで要素の文字列を得る
BeautifulSoup4のfind_allでタグを全てぶんまわす

タグのテキストをget_text()で取得する

タグのテキストはget_text()で取得できます。

html = '<p>Hello, </p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

print(soup.get_text())  

↑のコードを実行すると↓の結果になります。

Hello, World!  

↑のようにget_text()は子供のタグのテキスト内容をまとめて取得します。
取得したテキストのセパレータを指定したい場合はget_text()separator(第1引数)に引数を指定します。

from bs4 import BeautifulSoup  

html = '<p>Hello, </p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

print(soup.get_text('|'))  
Hello, |World!  

またテキストの両端にスペース類がある場合は、get_text()strip引数にTrueを指定してスペース類をストリップ(削除)します。

from bs4 import BeautifulSoup  

html = '<p>    Hello,\n</p><p>World!\n</p>'  
soup = BeautifulSoup(html, 'html.parser')  

print(soup.get_text(strip=True))  
Hello,World!  

↓の記事ではget_text()について詳しく解説しています。

findでテキストを検索する

find()の引数にtextがあります。
これに文字列を指定すると、その文字列の内容を持ったタグを取得できます。

from bs4 import BeautifulSoup  

html = '<p>Hello, </p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

found = soup.find(text='World!')  
print(type(found))  
print(found)  
<class 'bs4.element.NavigableString'>  
World!  

↑のようにfind(text='World!')NavigableString要素が取得できています。
NavigableStringのメソッドを使えばいろいろテキストを加工できます。
たとえばアッパーケースにしたい場合はupper()を使います。

from bs4 import BeautifulSoup  

html = '<p>Hello, </p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

found = soup.find(text='World!')  
print(found.upper())  
WORLD!  

それからreplace_with()を使えば文字列の中を取り換えることも可能です。

from bs4 import BeautifulSoup  

html = '<p>Hello, </p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

animals = BeautifulSoup('<span>Animals!</span>', 'html.parser')  
found = soup.find(text='World!')  
found.replace_with(animals)  

print(soup)  
<p>Hello, </p><p><span>Animals!</span></p>  

↑のコードでは<p>World!</p>のテキスト部分を<span>Animals!</span>に置き換えています。

find()について詳しく知りたい方は↓の記事も見てください。

タグの置き換え(replace)について詳しく知りたい方は↓の記事を参照。

findでタグを検索してテキストを得る

find()でタグを検索し、そのタグのテキスト内容をget_text()で得ることもできます。

from bs4 import BeautifulSoup  

html = '<p>Hello, <span>Good</span></p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

found = soup.find('p')  
print(found.get_text())  
Hello, Good  

find()は最初に見つかったタグを返します。
同名のタグが複数あって、それらを取得したい場合はfind_all()を使います。

from bs4 import BeautifulSoup  

html = '<p>Hello, <span>Good</span></p><p>World!</p>'  
soup = BeautifulSoup(html, 'html.parser')  

founds = soup.find_all('p')  
for found in founds:  
    print(found.get_text())  
Hello, Good  
World!  

liのテキストをまとめて取得する

<ul><li></li></ul>のような構造のタグから<li>のテキストをまとめて取得したい場合もfind_all()get_text()を組み合わせて使います。

from bs4 import BeautifulSoup  

html = '''<ul>  
<li>One</li>  
<li>Two</li>  
<li>Three</li>  
</ul>'''  
soup = BeautifulSoup(html, 'html.parser')  

lis = soup.find_all('li')  
for li in lis:  
    print(li.get_text())  
One  
Two  
Three  

特定のクラス名を持つ<ul>を狙い撃ちしたい場合は↓のようにコードを書きます。

from bs4 import BeautifulSoup  

html = '''  
<ul>  
<li>One</li>  
<li>Two</li>  
<li>Three</li>  
</ul>  
<ul class="jp">  
<li>いち</li>  
<li>にい</li>  
<li>さん</li>  
</ul>  
'''  
soup = BeautifulSoup(html, 'html.parser')  

ul = soup.find('ul', class_='jp')  
lis = ul.find_all('li')  
for li in lis:  
    print(li.get_text())  

find()class_を指定して特定のクラスの<ul>を取得します。
その<ul>find_all()を使って<li>を取得します。
そしてget_text()<li>のテキストを取得します。

おわりに

今回はPythonのBeautifulSoup4を使ってtextをfindする方法を解説しました。
テキスト内容(テキストコンテンツ)を取得出来ればスクレイピングも捗りそうですね。

🦝 < テキストを取得しよう

🐭 < 狙い撃ちだ