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

436, 2022-03-24

目次

PythonのBeautifulSoup4でtextをfindする

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

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

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

関連記事

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

(^ _ ^)

テキストを取得しよう

(・ v ・)

狙い撃ちだ



この記事のアンケートを送信する