PythonのBeautifulSoup4でtextをfindする【テキストを取得する】
目次
- PythonのBeautifulSoup4でtextをfindする
- タグのテキストをget_text()で取得する
- findでテキストを検索する
- findでタグを検索してテキストを得る
- liのテキストをまとめて取得する
- おわりに
PythonのBeautifulSoup4でtextをfindする
Pythonの外部ライブラリであるBeautifulSoup4を使うとHTMLやXMLを簡単にパースできます。
スクレイピングなどで、特定の要素のテキスト内容を取得したい場合などがあります。
そういう時はBeautifulSoup4でタグをfindして、そのfindしたタグのテキストを得ます。
あるいはfindのtext
引数にテキストを指定して、そのテキストを持ったタグを取ります。
この方法を覚えておくとスクレイピングなどがはかどります。
この記事ではBeautifulSoup4でテキストをfindする方法を解説します。
関連記事
BeautifulSoup4でタグをCSVに変換する
BeautifulSoup4のattrsの使い方【Python】
BeautifulSoup4でHTMLにタグを挿入する【Python】
BeautifulSoup4の削除系のメソッドを3つ紹介
タグのテキストを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 ・) | 狙い撃ちだ |