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する方法を解説しました。
テキスト内容(テキストコンテンツ)を取得出来ればスクレイピングも捗りそうですね。
🦝 < テキストを取得しよう
🐭 < 狙い撃ちだ