前回ではhtml用のテキストを作成しました。今回はダウンロードからHTML作成までトータルで実行できるプログラムに仕上げましょう。
以前、[F1公式サイトのスクレイピング](アドレス)は以下から。
取り出したデータと格納先
ここまでで取り出せたデータとその格納先です
- 【ドライバー名】
- ファーストネーム→firstname(数字)
- ファミリーネーム→familyname(数字)
- 【国籍】
- country(数字)
- 【所属チーム】
- teamname(数字)
- 【獲得ポイント】
- getpoint(数字)
という感じです。
htmlで出力(保存)する
テキストを出力する方法と同じで拡張子をhtmlに変更しましょう。使うのはnote系の命令です。debugの見出しもmake_htmlに変更しておきました。
//make_html html_text = "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"content-language\" content=\"ja\">\n<title>2016ドライバーランキング</title>\n<style>\nbody {\ncounter-reset: drivername;\n}\nli {\ndisplay: flex;\n}\ndiv {\nmargin-right: 1rem;\n}\n.drivername, .team {\nwidth: 9rem;\n}\n.country {\nwidth: 6rem;\n}\n.drivername:before {\ncounter-increment:drivername;\ncontent:counter(drivername) \"位 \";\n}\n</style>\n</head>\n<body>\n<h1>2016ドライバーランキング</h1>\n<ul>" repeat 40 if firstname(cnt) = "" : break html_text += "<li>\n<div class=\"drivername\">" + firstname(cnt) + " " + familyname(cnt) + "</div>\n<div class=\"country\">" + country(cnt) + "</div>\n<div class=\"team\">" + teamname(cnt) + "</div>\n<div class=\"point\">" + getpoint(cnt) + "</div>\n</li>\n" loop html_text += "</ul>\n</body>\n</html>\n" notesel html_text notesave "driverspoint.html" noteunsel await 1 dialog "save html file" //mesbox html_text, 640, 400 stop
となります。これを組み込んで実行してみると
開くと文字化けしていました。。。これは保存されたファイルの文字コードがutf-8になっていないからだと思われるので保存する前にhtml_textをutf-8にエンコードしておきましょう。ということで次の一文をnoteselの前に追加しておきます。
nkfcnv html_text,html_text,"Sw"
今度は文字化けなく表示されました。ドライバー名が長かったりすると改行が発生してしまってるので、微調整しておきましょう。CSSの部分を
.drivername, .team { width: 12rem; }
に修正しておきました。さらに順位とドライバー名の表示も整えたいので
.drivername:before { counter-increment: drivername; content: counter(drivername) "位 "; display: inline-flex; width: 3rem; }
としています。
ダウンロードから生成まで通してみる
以前のダウンロードのプログラムと今回までのhtml生成プログラムをつなげてみましょう。特に注意する部分はないですが、記事執筆時にレースが開催されてランキングが変動している可能性があるので、以前のダウンロードしたファイルや生成したファイルはリネームして保存しておきました(混乱しかねないので)。
また、ダウンロードの成功時にstopしておいた部分もコメントアウトしておくのを忘れないように。
//HSPモジュール SAKMISさんのを使用しています //命令→lfcc ファイルネーム //読み込み→改行置換→保存 #module #deffunc lfcc str filename ; mref filename,32 ; mref status,64 exist filename size=strsize if size=-1 : status=-1 : return sdim ss,size+1,1 bload filename,ss,size ii=0 code=0 sdim data,size<<1,1 repeat size tt = peek (ss,cnt) if tt=10 : code=10 : break if tt=13 { code=13 tt = peek (ss,cnt+1) if tt=10 : code=0 break } loop if code=0 : status=-1 : return repeat size tt = peek (ss,cnt) if tt=code : wpoke data,ii,2573 : ii+2 : continue poke data,ii,tt : ii++ loop bsave filename,data,ii status=ii return #global #include "hspinet.as" // ネット接続の確認 netinit if stat : dialog "ネット接続できません" : end // 初期設定 download_url = "https://www.formula1.com/en/results.html/2016/drivers.html" sdim firstname, 40, 40 sdim familyname, 40, 40 sdim country, 40, 40 sdim teamname, 40, 40 sdim getpoint, 40, 40 /* 第一回で作成したダウンロード部分 */ // URL分解 if (instr(download_url, 0, ".html") ! -1) or (instr(download_url, 0, ".php") ! -1) { //.html .phpが含まれているなら split download_url, "/", result url_pagename = result(stat-1) url_address = download_url strrep url_address, url_pagename, "" } else { // 含まれていない場合はindex.htmlにする url_address = download_url url_pagename = "index.html" } neturl url_address netrequest url_pagename *main //取得待ち確認 netexec res if res > 0 : goto *comp if res < 0 : goto *bad await 50 goto *main *bad //エラー neterror estr mes "ERROR "+estr stop *comp mes "DOWNLOAD 完了" //stop /*html生成部分(2~5回で作成)*/ lfcc "drivers.html" notesel htmlfile noteload "drivers.html" first_cnt = 0 : family_cnt = 0 : country_cnt = 0 : teamname_cnt = 0 repeat notemax noteget text_line, cnt // ファーストネーム if (instr(text_line, 0, "hide-for-tablet") ! -1) { strrep text_line, "<span class=\"hide-for-tablet\">", "" strrep text_line, "</span>", "" strrep text_line, " ", "" //split text_line, ">", buf //split buf(1), "<", result //text_line = result(0) firstname(first_cnt) = text_line first_cnt++ continue } // ファミリーネーム if (instr(text_line, 0, "hide-for-mobile") ! -1) { strrep text_line, "<span class=\"hide-for-mobile\">", "" strrep text_line, "</span>", "" strrep text_line, " ", "" familyname(family_cnt) = text_line family_cnt++ continue } // 国籍 if (instr(text_line, 0, "dark semi-bold uppercase") ! -1) { strrep text_line, "<td class=\"dark semi-bold uppercase\">", "" strrep text_line, "</td>", "" strrep text_line, " ", "" country(country_cnt) = text_line country_cnt++ continue } // 所属チーム if (instr(text_line, 0, "grey semi-bold uppercase ArchiveLink") ! -1) { split text_line, ">", buf split buf(1), "<", result teamname(teamname_cnt) = result(0) teamname_cnt++ continue } // 獲得ポイント if (instr(text_line, 0, "dark bold") ! -1) and (instr(text_line, 0, "</td>") ! -1) { strrep text_line, "<td class=\"dark bold\">", "" strrep text_line, "</td>", "" strrep text_line, " ", "" getpoint(point_cnt) = text_line point_cnt++ continue } loop noteunsel //make_html html_text = "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"content-language\" content=\"ja\">\n<title>2016ドライバーランキング</title>\n<style>\nbody {\ncounter-reset: drivername;\n}\nli {\ndisplay: flex;\n}\ndiv {\nmargin-right: 1rem;\n}\n.drivername, .team {\nwidth: 12rem;\n}\n.country {\nwidth: 6rem;\n}\n.drivername:before {\ncounter-increment:drivername;\ncontent:counter(drivername) \"位 \";\ndisplay: inline-flex;\nwidth: 3rem;\n}\n</style>\n</head>\n<body>\n<h1>2016ドライバーランキング</h1>\n<ul>" repeat 40 if firstname(cnt) = "" : break html_text += "<li>\n<div class=\"drivername\">" + firstname(cnt) + " " + familyname(cnt) + "</div>\n<div class=\"country\">" + country(cnt) + "</div>\n<div class=\"team\">" + teamname(cnt) + "</div>\n<div class=\"point\">" + getpoint(cnt) + "</div>\n</li>\n" loop html_text += "</ul>\n</body>\n</html>\n" nkfcnv html_text,html_text,"Sw" notesel html_text notesave "driverspoint.html" noteunsel await 1 dialog "save html file" //mesbox html_text, 640, 400 stop
これを実行してみると…
無事にダウンロード~生成まで完成しました。
まとめ 次回、少し改良してみる
次に、このランキングがどのレース終了時点のものなのかを表示して、ファイル名も変更させたいと思います。次回、いよいよ完成となる予定です。また、上のスクリプトもお試しください!