天鳳のログから和了形を抽出する その1
天鳳
最近ブログの更新をさぼっていましたが、裏では麻雀で遊んでいました。プログラミングに関しては、麻雀の点数計算のプログラムを書いていました。そこで、テストケースが必要になってので、天鳳のログから和了形と点数を抽出しようと思います。
同じことをしたい人は、
が参考になるので、そちらを見てください。
ログ
天鳳のログのページには、ログのzipファイルのリンクが置かれているので、そこからダウンロードして解凍します。
フォルダの中には、html形式とlog形式のファイルがありますが、ここではhtml形式のファイルを使います。
HTMLファイル
HTMLファイルは次の画像のようになっています。
牌譜というリンクを辿ると、その対局の牌譜を見ることができます。
コンソール上では、
['00:02', '|', '28', '|', '四鳳南喰赤-', '|', '<a', 'href="http://tenhou.net/0/?log=2018010100gm-00a9-0000-257139d7">牌譜</a>', '|', 'まきし(本垢1)(+49.0)', 'みっきー(+3.0)', '真エトペン(-18.0)', 'かき氷(-34.0)<br>\n']
のように表示されています。天鳳の牌譜をXMLで取得するには、
http://tenhou.net/0/?log=2018010100gm-00a9-0000-257139d7
を
http://tenhou.net/0/log/?2018010100gm-00a9-0000-257139d7
に変換してやる必要があります。
XMLからAGARIタグを抽出する
正規表現で抜き出しても良いと思いますが、その場しのぎのコードとなっています。
.gz となっているファイルは、gzip を使って開きます。
import os import gzip from lxml import html import requests import lxml from bs4 import BeautifulSoup script_dir = script_dir = os.path.abspath(os.path.dirname(__file__)) path = os.path.join(script_dir, "../tenhou_log/2018/scc20180101.html.gz") idx = len('href="http://tenhou.net/0/?log=') agari_data = [] with gzip.open(path, "rt", encoding="utf_8") as f: line = f.readline() print(line) while(line): v = line.split(" ") # 三麻を除く if '三' in v[4]: line = f.readline() continue url = 'http://tenhou.net/0/log/?' + v[7][idx : len(v[7]) - 8] r = requests. get(url) html = lxml.html.fromstring(r.text) soup = BeautifulSoup(r.text, 'lxml-xml') data = soup.find_all("AGARI") for d in data: agari_data.append(d) line = f.readline()
上記のコードでは、5045回の上がりがありました。
AGARIタグの内容は次のようになっています。
<AGARI ba="0,0" doraHai="22" fromWho="3" hai="8,10,11,50,53,57,81,86,88,97,98" m="49771" machi="86" sc="224,0,237,0,237,20,302,-20" ten="30,2000,0" who="2" yaku="19,1,54,1"/>