【Pythonサンプルコード】スクレイピングで文字列から数字だけ抽出したい時の簡単な方法を解説
文字列から数字だけを抽出したい
Pythonでスクレイピングする時、抽出したい対象が「22,323アクセス」の様に、単純な数字だけではなく要らないテキストも一緒にくっついている場合があります。
そこで今回は簡単にこの様な文字列から数字だけ抜き出す方法をご紹介します。
カンマだけ外す方法
先に一般的なpythonサンプルコードであるreplaceを使って、数字列内にある「,(カンマ)」を外す手法を紹介しておきます。
いったん数字を文字列として扱い、カンマを何も無い文字に置き換えるという手法です。
pv_text="22,323アクセス" pv_cnt=pv_text.replace(",","") print(pv_cnt) #22323アクセス
デメリットとして、replaceを使う方法だと文字列毎に置き換える対象をしてしないといけないので汎用性がないことが挙げられます。
今回の例のようにカンマだけでなく「アクセス」という文字列も含まれてしまっている場合、それもわざわざ指定して外す必要が生じてしまいます。
「re.sub」を使う方法
よりシンプルなのは「re.sub」を使う方法です。
この方法を使えば数字以外を全て削除することができるので、より多くのテキストに対してそのまま使うことが出来ます。
準備
reパッケージはpythonに最初から入っているので特にpipからインストールしたりする必要はありません。
サンプルコード
import re import requests from bs4 import BeautifulSoup headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"} url="https://kasasagi.hinaproject.com/access/top/ncode/n2919fm/" response = requests.get(url=url, headers=headers) html = response.content soup = BeautifulSoup(html, "lxml") #td[-8]タグ内のテキストだけ抽出 pv_text=soup.find_all("td",class_="right")[-8].text print(pv_text) #数字以外を削除する pv_cnt = int(re.sub("\\D", "", pv_text)) print(pv_cnt)
解説
int(re.sub("\\D", "", pv_text))
の所で文字列の中から数字以外を何も文字に置き換えています。
引用
re.sub(置換したい文字列(正規表現), 新しい文字列(正規表現), 対象の変数 [,置換回数])
Pythonの文字列を削除する方法まとめ | HEADBOOST
トラブルシューティング
expected string or bytes-like object
上記エラーが表示される場合は、元データがint型やfloat型になっている可能性があります。
回避方法としては一度str型に変換する処理を挟むと良いです。
import re # エラーが表示される構文 a = 0 b = int(re.sub("\\D", "", a)) # エラーが表示されない構文 a = 0 a = str(a) b = int(re.sub("\\D", "", a))