- 1. 概要
- 2. ソース
1. 概要
実は、コンテンツの文字数を数える必要に迫られましてな。
ウェブサービスでそれっぽいものを探してみましたが、なんか「SEO」関連でキーワードを含む文字列を数えるとかはあるものの、1ページ単位で文字数を数えるものを見つけられませんでした。
ブラウザでやろうかと、拡張機能をいれてみましたが(「ブラウザ - Vivaldi - 拡張機能」参照)これも、いちいち文字を選択しなければならず、画像やらなにやら混じっているとわけわからん。
そこでまぁ、前出の「BeautifulSoup」を使って、数えてやろうと目論んだわけです。
2. ソース
でまぁ、でけました。
import inspect, os
import re
import ssl
import sys
from urllib import request
from urllib.error import URLError, HTTPError
from socket import timeout
from bs4 import BeautifulSoup
# @file CountCharacters.py
# @version 0.1
# @author show.kit
# @date 2022年10月17日
# @brief コンテンツの文字数カウント
if (len(sys.argv) < 2):
print('URL を指定してください')
exit()
# URL を取得
url = sys.argv[1]
# ウェブスクレイピングのためのパラメータ設定
data = b'button=on'
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.108 Safari/537.36' }
method = 'POST'
timeout = 10
ssl._create_default_https_context = ssl._create_unverified_context
try:
# URL をオープンしてコンテンツを取得
req = request.Request(url, data=data, headers=headers, method=method)
html = request.urlopen(req, timeout=timeout)
soup = BeautifulSoup(html, "html.parser")
html.close()
# <body> を取り出す
body = soup.find('body')
# <dl> <h4> <img> のタグは取り除く
for tag in body.findAll(["h1", "dl", "h4", "img"]):
tag.decompose()
# <pre class="bare"> <pre class="line-numbers"> のタグは取り除く
class_name = [ 'bare', 'line-numbers' ]
for name in class_name:
for tag in body.findAll('pre', attrs=name):
tag.decompose()
# ホワイトスペースを取り除く
text = re.sub(r'\s+', '', body.get_text())
print(text)
print(len(text))
except Exception as ex:
curr = inspect.currentframe()
info = inspect.getouterframes(curr)[1]
print("[例外発生] (%s:%d)" % (os.path.basename(info.filename), info.lineno), flush=True)
print(url)
print("[", ex.args, "]")
print(ex)
exit()
さほど長くないし、適宜、コメントをいれておりますので、特に解説はしませんが。
本サイトに限った、特殊処理ばかりではありますので、あまり参考にはならないかと思います。
本サイトのコンテンツの原文を読んで、ソースと見比べるといくらかわかるのではないかと思っております。
ちなみに、本章の冒頭のページで、上記プログラムを実行すると、下記のようになります。
言い訳がましいことを言いますが、ウェブ屋ではないものでスクレイピングという言葉は聞いたとがあるものの、中身について は知らなかったのです。でまぁ、ウィキペディアで知ったわけなので。定義は「ウィキペディア-ウェブスクレイピング」をご参照ください。ま、とりあえず、pythonでウェブスクレイピングしてみようと思うのです。果たしてどのサイトがわたしに合うの かわからないのですが参考になりそうなサイトを探してみました。「シンプルで覚えやすい仕様,パワフルなPythonのWebアクセスモジュールrequest」
251
2022年10月17日時点のものなので、今後、該当のページが変わった場合は、文字数が変わっているかもしれません。
|