【Python】英単語帳を作る
さて、今年も受験シーズンが本格的にはじまりセンター試験の日になりましたね。
去年の今頃は私も勉強に勤しんでいました。
そんな訳ですが、今回はPythonを使ってフラッシュ英単語帳を作っていきたいと思います。”フラッシュ”というのは私が勝手に名付けたものですが、高速で流れる数値を暗算していくフラッシュ暗算を想像してみたらわかると思います。これの英単語バージョンです。
プログラムの大まかな流れは、英単語サイトのスクレイピング→ファイルに書き込み→英語と日本語に分ける→英語と日本語を交互に出していくというものです。使い方は英単語が出てきて数秒後に日本語(解答)が出てきます。英単語が流れてる間に日本語を想像する、という単純なものです。同一サイトの過度なスクレイピングはサーバー負担の原因となるので、ファイルに書き込んでしまいます。
モジュール
- BeautifulSoup(外部モジュール pip3 install BeautifulSoup4)
- random
- urllib
- time
- os
- re
スクレイピングの対象
http://www7b.biglobe.ne.jp/~browneye/english/
今回はTOEIC頻出単語400点コースを対象としました。
コード
from bs4 import BeautifulSoup as bs import urllib.request as ur import re import random from time import sleep import os def Soup(): url = 'http://www7b.biglobe.ne.jp/~browneye/english/TOEIC400-1.htm' req = ur.urlopen(url) html = bs(req,"html.parser") html = str(html) return html #url = スクレイピング対象のURL #htmlを戻り値とする(文字列の同士の正規表現なのでstrをつける) def Re(): pa = '<td>(.+)</td>' ma = re.findall(pa,Soup()) return ma #pa = 正規表現のパターン(tdタグに囲まれた文字列)を格納 #ma = 上記の正規表現にマッチする文字列をリストで格納 #変数maを戻り値とする
以前紹介したスクレイピングと正規表現の型を流用しています。
画像はサイトの表記ミスだと思いますが、英語、日本語訳、品詞の順番に全て関数Reの戻り値に格納されます。
if not os.path.exists('tango.txt'): for i in Re(): with open('tango.txt','a') as a: a.write(i + '\n') #もし"tango.txt"というファイルが存在しなかったら #”tango.txt"というファイルを生成し英語、日本語訳、品詞を順番に書き込む
生成されたtango.txtはこんな感じ。
else: with open('tango.txt','r') as r: text = r.read().split('\n') jp = text[1::3] en = text[::3] while True: ran = random.randint(0,len(jp) - 1) print(en[ran]) sleep(2) print(jp[ran]) print('') sleep(1) #"tango.txt"が生成されていた場合 #"tango.txt"を読み込み変数textに段落でsplitしリストとして格納 #下記を無限ループ 擬似乱数はループ内で再定義する必要があるの #変数enとjpにそれぞれ英語と日本語訳を格納(スライスの説明は略) #変数ranに0から変数jpのリストに格納されている数から1引いた数までで擬似乱数を格納 #変数jpのインデックスに擬似乱数を入れて出力、sleep2秒、変数enの...、sleep1秒
全体像。
from bs4 import BeautifulSoup as bs import urllib.request as ur import re import random from time import sleep import os def Soup(): url = 'http://www7b.biglobe.ne.jp/~browneye/english/TOEIC400-1.htm' req = ur.urlopen(url) html = bs(req,"html.parser") html = str(html) return html def Re(): pa = '<td>(.+)</td>' ma = re.findall(pa,Soup()) return ma if not os.path.exists('tango.txt'): for i in Re(): with open('tango.txt','a') as a: a.write(i + '\n') else: with open('tango.txt','r') as r: text = r.read().split('\n') en = text[::3] jp = text[1::3] while True: ran = random.randint(0,len(jp) - 1) print(en[ran]) sleep(2) print(jp[ran]) print('') sleep(1)
実行してみました。
英単語は反復練習!!!(って誰かが言ってた)
完。