前回はドライバー名が格納できたので、今回はそれを以外のデータを取り出していきたいと思います。
以前、[F1公式サイトのスクレイピング](アドレス)は以下から。
以前、スクレイピングの際に調べたやつ
以前、スクレイピングで調べた際の情報です。
- 【ドライバー名】
- ファーストネーム→クラス名(hide-for-tablet)、タグ(span)
- ファミリーネーム→クラス名(hide-for-mobile)、タグ(span)
- 【国籍】
- クラス名(dark semi-bold uppercase)、タグ(td)
- 【所属チーム】
- クラス名(grey semi-bold uppercase ArchiveLink)、タグ(a)
- 【獲得ポイント】
- クラス名(dark bold)、タグ(td)
という感じになります。
国籍と所属チームを取り出す
それぞれのクラス名は
- dark semi-bold uppercase
- grey semi-bold uppercase ArchiveLink)
となっています。これを前回までのスクリプトに加えてみましょう。if~instrを使ってrepeat~loopの中に組み込んでいきます。まずは国籍ですが、最初にどんな1行になっているのかを確認するために以下のコードを入れ込んで実行してみます。
if (instr(text_line, 0, "dark semi-bold uppercase") ! -1) { dialog text_line continue }
結果は
国籍の場合は今までのspanではなく、tdです(上のスクレイピング時の情報にも書いてあるんですがね)。注意してください。具体的には以下のようになります。
これを踏まえて次のようなスクリプトになりました。
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 }
一方、所属チームの方は取り除く方式ではちょっとまずくて
のようにurlがそれぞれ別々になっているため、同じ要素を単純に取り除くわけにはいかない状況。そこで前回書いていたもうひとつの方法を用いて取り出していきます。
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 }
これで国籍と所属チーム名が取り出せたはずですので、chkで表示させていきましょう。以下のように改造しました。
chk = "" repeat 40 if firstname(cnt) = "" : break chk += firstname(cnt) + " " + familyname(cnt) + "\t(" + country(cnt) + ") \t【" + teamname(cnt) + "】\n" loop mesbox chk, 640, 400
実行結果は
ばっちり取得できてますね。
獲得ポイントの取得
次は獲得ポイントです。これはスクレイピングの時にもひっかかったところなのですが、クラス名「dark bold」は2種類のタグで使われていて、そのうちのtdタグの方がポイントのデータが書かれている1行だったりします。そこで判定方法にひと工夫加えて
if (instr(text_line, 0, "dark bold") ! -1) and (instr(text_line, 0, "</td>") ! -1) { dialog text_line continue }
「dark bold」があって、かつ「</td>」がある行のみを取り出しています。
無事取り出せました。これもポイントだけを取り出すように処理しちゃいましょう。上記の確認用のスクリプトを以下のように書き換えます。
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 }
さらに、確認部分も
chk += firstname(cnt) + " " + familyname(cnt) + "\t(" + country(cnt) + ") \t【" + teamname(cnt) + "】 " + getpoint(cnt) + "p\n"
と書き換えておきます。
ポイントも無事に取り出せました。
まとめ
スクレイピングでやってたことをHSPでも無事に実行できました。次はいよいよページの作成にとりかかりたいと思います。
今回の全コードは以下のようになりました。試してみてくださいね。(その1でダウンロードしたdrivers.htmlが必要です)
//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 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, " ", "" 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 //debug chk = "" repeat 40 if firstname(cnt) = "" : break chk += firstname(cnt) + " " + familyname(cnt) + "\t(" + country(cnt) + ") \t【" + teamname(cnt) + "】 " + getpoint(cnt) + "p\n" loop mesbox chk, 640, 400 stop
そこそこ長くなってきましたね。