なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

【Pythonサンプルコード】スクレイピングで文字列から数字だけ抽出したい時の簡単な方法を解説

文字列から数字だけを抽出したい

Pythonスクレイピングする時、抽出したい対象が「22,323アクセス」の様に、単純な数字だけではなく要らないテキストも一緒にくっついている場合があります。

そこで今回は簡単にこの様な文字列から数字だけ抜き出す方法をご紹介します。

f:id:karupoimou:20190708101301p:plain:w400
数字入りテキスト

カンマだけ外す方法

先に一般的なpythonサンプルコードであるreplaceを使って、数字列内にある「,(カンマ)」を外す手法を紹介しておきます。

いったん数字を文字列として扱い、カンマを何も無い文字に置き換えるという手法です。

pv_text="22,323アクセス"
pv_cnt=pv_text.replace(",","")
print(pv_cnt)
#22323アクセス

f:id:karupoimou:20190708102226p:plain:w400
結果

デメリットとして、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)

f:id:karupoimou:20190708103536p:plain:w400
結果

解説

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))