なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこ3のJS実行と変数をやりとりする

JS実行サンプル

なでしこ3にはjavascriptを文字列で与えて実行する JS実行 命令があります。
以下は変数aaaalert…なでしこ3の言う命令を実行させるところです

「const aaa = "こんにちは"; alert(aaa)」JS実行

この変数aaaに、なでしこ3側で用意した変数を渡したいときの書き方を考えます。

「{変数名}」で渡す(いまいち)

挨拶「こんにちは」
「const aaa = "{挨拶}"; alert(aaa)」JS実行

まず、なでしこの変数「挨拶」に「こんにちは」を入れて、{}を使った変数の展開する方法が考えられます。

これにはいくつか面倒な点があって

javascriptに{}があると「」でくくれない
・変数の型が文字列、数値で書き方がかわる
・変数の型が配列、辞書型だと入れられない
・関数、DOM部品などの参照が難しいやつは無理

といった感じです。 いまいち!

単置換で渡す(いまいち)

挨拶「こんにちは」
『const aaa = "置換対象"; alert(aaa)』「置換対象」挨拶単置換してJS実行

「」から『』にすることで、javascriptに{}があっても影響を受けにくくなりました。
前項の問題点の1つ解決したものの、いまいち!

JSONエンコードを使う

挨拶「こんにちは」
『const aaa = 置換対象; alert(aaa)』「置換対象」(挨拶JSONエンコード)単置換してJS実行

JSONエンコードを使った方法は、文字列型・数値型・配列・辞書型に対応します。
単純な変数ならこれでOKですが、関数やDOM部品などのオブジェクトは扱うことはできません。

WINDOWを使う

挨拶「こんにちは」
WINDOW["なでしこ"]=挨拶
『const aaa = window["なでしこ"]; alert(aaa)』JS実行

なでしこ3(ブラウザ版)にWINDOWという変数があります。
なでしこさん マニュアル - plugin_browser

マニュアルでは『ブラウザのwindowオブジェクトです。』という説明になっています。
javascriptでwindowはブラウザのwindowオブジェクトを指します。
すなわち、なでしこ3の「WINDOW」とjavascriptの「window」は同じものを指しています

これなら関数やDOM部品などのオブジェクトも渡すことができます。

コンソール版では使えない?

「WINDOW」はブラウザ版のプラグインに入っているので、コンソール版にはないような気がします(試してない)
コンソール版で使えるステキな方法があればコメント欄へお知らせください。

なでしこ3webkit版の内部情報取得命令を使ってみる

前回の続き。

なでしこ3webkit版の特殊命令「内部情報取得」系の命令を使ってみます。

非同期命令の「内部情報取得時には」と、 そうじゃない「内部情報取得」があります。

触って分かったのですが、戻り値の型が違うので注意が必要です。

ここではwindows用のwebkit版v3.4.13を使用しています。 未来のバージョンでは仕様が変更になる可能性があります。

「内部情報取得時には」命令

まずは「内部情報取得した時」について見てみます。
サンプルでは対象を反復しているところをみるに、「対象」に返ってきて、辞書型であるようです。

//なでしこ3webkit版v3.4.13
内部情報取得した時
  対象コンソール表示
ここまで

実行結果

対象に辞書型で返ってくることが確認できました。 キーは以下の通り。

 EXEパス,ユーザフォルダ、作業フォルダ、母艦幅、母艦高、起動ポート

辞書型なので  対象"EXEパス"表示 または  対象["EXEパス"]表示 とすることで、webkit版の実行ファイルである nadesiko3.exe のフォルダパスが取得できます。

「内部情報取得」命令

非同期命令じゃないほうの「内部情報取得」を試してみましょう。
こうでしょ!

//なでしこ3webkit版v3.4.13
内部情報取得
それコンソール表示

実行結果

エラーなく動きましたね。
では"EXEパス"を表示してみましょう。

//なでしこ3webkit版v3.4.13
内部情報取得
それ"EXEパス"表示

・実行結果

undefined(未定義)、ですね…?

よくよくみたらこの返ってきた値は…『文字列』ではないですか!
下記のように JSONデコード したら動きました。

//なでしこ3webkit版v3.4.13
内部情報取得  //JSON文字列が返る
それJSONデコード
それ"EXEパス"表示

なでしこv1の母艦パスなどの、パス取得系が返す文字列には末尾に「\」がついていましたが、 内部情報取得系ののexeパスには末尾に「\」がないので注意します。

webkit版からnakoファイルを起動する

あらためて前回やりたかった「nadesiko3.exeの横にあるnakoファイルを起動」をしてみます。

//なでしこ3webkit版v3.4.13
//exeファイルの横にあるnakoファイルを起動するサンプル
内部情報取得  //JSON文字列が返る
それJSONデコード
exeパスそれ"EXEパス"
nakoファイルパス「{exeパス}\テスト.nako」 //exeパスのうしろに\が必要

ナデシコランタイムパス「C:\Program Files (x86)\nadesiko_lang\vnako.exe」 //環境による

[ナデシコランタイムパス,nakoファイルパス]起動 //[exeファイル, nakoファイル]を起動

「完了」表示 //テスト.nakoを閉じたのちに実行される

まとめ

(webkit版v3.4.13・2023年7月現在)
 ・内部情報取得時には … 対象に辞書型のオブジェクトを返す
 ・内部情報取得    … それにJSON文字列を返す

バージョンで変わってくるかもしれないので、いじって確かめましょう!

なでしこ3のwebkit版からnakoファイルを起動する

なでしこ3webkit版には特殊命令がいくつか実装されています。
ブラウザ版などにないwebkit版専用の命令です。

特殊命令のなかに非同期命令の「起動時には」と非同期でない版「起動」命令があるので使ってみます。
なでしこ1のプログラムであるnakoファイルを「起動」してみましょう!

ここではwindows用のwebkit版v3.4.13を使用しています。
未来のバージョンでは仕様が変更になる可能性があります。

なでしこ3webkit版とは

ダウンロードはここ。

github.com

win-nako3-chrome.zipのほうはなぜか起動後に落ちるので
win-nako3-webview2.zipを解凍して使います。(2023年7月現在うちの環境にて)

中にはexeファイルとwebappフォルダがあります。 exeファイルを実行すると普通のアプリのようにウィンドウが開きます。

ウィンドウの中身はブラウザのような部品でできており、フォルダ内のindex.htmlの内容が表示されます。
webapp内のmain.nako3に書いたなでしこ3のプログラムが動きます。

webkit版専用の命令について

なでしこ3webkit版にはブラウザ版にはない特殊命令があります。
公式の解説はこのへんに。

https://nadesi.com/doc3/index.php?%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92PC%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E3%81%97%E3%81%A6%E9%85%8D%E5%B8%83#h9d62f71d

https://github.com/kujirahand/nadesiko3webkit/blob/main/batch/res/README.md#%E7%89%B9%E6%AE%8A%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

特殊命令にはwebkit版v3.4.13になって増えたものがあります。
以前のバージョンは非同期の命令(~~時には)だけでした。
マニュアル類はその頃に書かれたもののようで、非同期じゃない命令のマニュアルはないようです。(2023年7月現在)

この特殊命令のうち、「起動した時には」と「起動」について解説していきます。
「内部情報取得」もやろうとしたけど次回にまわします。

「起動」命令の引数に気を付ける

注意:なでしこ3マニュアルには「起動」(コンソール版用)の命令が載っていますが、webkit版の「起動」は別の実装となっています

非同期命令の「起動した時には」と、
そうじゃない「起動」があります。

webkit版のサンプルでは電卓を起動しています。windows版だとこう書く模様。

//なでしこ3webkit版v3.4.13
「calc」起動した時
  「電卓起動」表示。
ここまで

…このサンプルは非同期実行の命令、「起動した時には」ですね。 「起動」のサンプルはないようです。

やってみましょう。こうでしょ!

「calc」起動

実行結果

[実行時エラー]main.nako3(22行目): json: cannot unmarshal string into Go value of type []string

は?

エラーが異国語で書かれているのではっきりわかりませんが「stringをunmarshalできませーん」と言っている気がします。

unmarshalとは

Unmarshalは、ネットワーク越しに送信されたデータをGoの構造体に変換します。
Unmarshalは、JSON形式で受け取った値を指定した構造体に格納することができます。
第1引数にJSON形式のデータを、第2引数に格納したい構造体を指定します。2022/10/02

よし、わからない。
わからないのででたらめに試した結果

["calc"]起動

起動の引数を配列にすると動くことがわかりました。
ついでに ["calc"]起動した時 も動くことがわかりました。

テキストファイルやnakoファイルを起動する

次はテキストファイルを起動してみましょう。
なでしこ1ではテキストファイルのフルパスを起動するだけでした。

//なでしこ1
"C:\test\aaa.txt"起動

なでしこ3webkit版では配列に実行ファイルとテキストファイルを指定する必要があるようです。

//なでしこ3webkit版v3.4.13
["notepad","C:\test\aaa.txt"]起動した時 //非同期命令

//なでしこ3webkit版v3.4.13
["notepad","C:\test\aaa.txt"]起動

nakoファイルを起動する場合は
 [vnako.exeのパス,nakoファイルのパス]を起動
でできるようです。

vnako.exeのパスは、なでしこv1のエディタを起動し、

//なでしこ1
ナデシコランタイムパス言う

を実行することで取得できます。

//なでしこ3webkit版v3.4.13
ナデシコランタイムパス「C:\Program Files (x86)\nadesiko_lang\vnako.exe」 //環境による
nakoファイルパス「C:\test\テスト.nako」
[ナデシコランタイムパス,nakoファイルパス]起動 //なでしこv1起動待機に相当?
「起動しました」表示 //ウィンドウを閉じてから表示される

まとめ

(なでしこ3webkit版v3.4.13)
・「起動した時には」(引数は文字列か配列)

「calc」起動した時 //文字列 うごく  
["calc"]起動した時 //配列 うごく

・「起動」(引数が文字列だとエラー)

「calc」起動 //文字列 エラー json: cannot unmarshal string into Go value of type []string
["calc"]起動 //配列 うごく

・テキストファイルを起動する場合、配列にする

["notepad","C:\test\aaa.txt"]起動

・nakoファイルを起動する場合、ランタイムのvnako.exeのパスとnakoファイルのパスを配列にする

[ナデシコランタイムパス,nakoファイルパス]起動

なでしこの質問掲示板で気になった質問

なでしこの質問掲示板で気になる質問がありました

日本語プログラミング言語なでしこ公式掲示板

なでしこ1で、ボタンを配列で作成したのですが、クリックした時の挙動が変です
どのボタンが押されたかをタグで認識させたいのですが、以下のプログラムでB【0】のタグが1となり、B【8】をクリックするとエラーになります
このプログラム、どこがおかしいのでしょうか?ご教示お願いします(バージョン 1.588です)

ID0から8まで繰り返す //…1行目
  B【ID】ボタンして作成。
  B【ID】Y=25*ID
  B【ID】タグID
  B【ID】テキストID
  B【ID】クリックした時
    「{B【ID】→タグ}」ボタン押した時 //…7行目
ここまで●ボタン押した時(IDで) //…10行目
    「{ID}を押しました」言う。

これ系は見たことがあったので、7行目の「B【ID】→タグ」を「自身→タグ」にすれば解決とすぐわかりました。

ただ、質問文のなかで

「プログラムでB【0】のタグが1となり、B【8】をクリックするとエラーになります」

とあります。
あれ、思ってたのと違う?

気になった理由

まずプログラムの構造ですが、変数「ID」が3つ登場しています。

 ID0から8まで繰り返す //…1行目
 「{B【ID】→タグ}」ボタン押した時 //…7行目
 ●ボタン押した時(IDで) //…10行目

1行目の変数IDはグローバル変数です。
10行目の変数IDはローカル変数です。
そして7行目の変数IDが問題です。

7行目のIDはグローバル変数で、ID0から8まで繰り返す をしたので「ID=8」になっていると思いました。

「ID=8」だったとすると
「{B【ID】→タグ}」ボタン押した時 の部分は
「{B【8】→タグ}」ボタン押した時 となり、どのボタンも8と同じ挙動するはずだと思いました。

実際にプログラムを動かすと、B【0】のボタンはB【1】→タグを参照し、「1を押しました」と表示されます。
B【8】のボタンはB【9】→タグを参照し、エラーとなります。

思ったのと違う!

IDが指すもの

クリックした時は~の中で指している「ID」は、ボタンのメンバ変数の「ID」だったのです。
「ボタンのID」には作った部品の番号が入るようです。

そして「{B【ID】→タグ}」ボタン押した時 のIDは、自身ID を指していたということです。

変数名が同じ場合、ローカル変数、グループのメンバ、グローバル変数の順で探しに行く。
グループのメンバと同じ名前のグローバル変数は使わないほうがよいですね。

なでしこでエクセルを操作してみる

なでしこは標準でエクセルに関する命令があります。

たとえば…
エクセル起動
エクセル開く
エクセルシート列挙
エクセルシート注目
エクセルシート名変更
エクセルCSV保存
エクセルセル一括取得
…などなど

命令名だけで何ができそうか分かりやすいのがいいですね。

ただし「エクセル開く」で開いたファイルにしか操作が効かないので、用途はある程度限られます。

とりあえずサンプルを作ってみました。

なでしこでシートをたくさん作る

//シートをたくさん作る
エクセル起動
エクセル新規ブック
5回
  エクセル新規シート
  エクセルシート名取得
  それ回数エクセルシート名前変更

これで新規のエクセルに1~5という名前のシートが作られます。

エクセルシート名前変更の引数をくふうすればこうなります。↓

なでしこでフォルダ内のエクセルからCSVを作る

作業フォルダ「D:\」
エクセル起動
エクセル警告無視
「*.xlsx」ファイル列挙して反復
  「{作業フォルダ}{対象}」エクセル開く
  「{マイドキュメント}{対象}.csv」エクセルCSV保存
  エクセル閉じる
おわり

Dドライブ直下にあるxlsxファイルを列挙してエクセルCSV保存でCSVファイルにしていきます。
エクセル警告無視を入れてありますが、開いたら文句を言われるファイル対策になるかと思います。(適当)

なでしこの母艦にドロップしたファイルを操作する

母艦ファイルドロップ許可オン
母艦ファイルドロップした時
  母艦ドロップファイル反復
    エラー監視
      対象エクセル開く //エクセルが起動していれば開く
    エラーならば
      エクセル起動 //エクセルが起動してから開く
      対象エクセル開く
    「A1」から「D5」までエクセル一括取得して表示
    エクセル閉じる

ドロップしたファイルを処理する場合を考えてみます。
あらかじめエクセル起動をしておいてドロップしたファイルを開けばいいのですが、
ユーザーが途中でエクセルを閉じた場合エクセル開くが失敗します。

なでしこが操作できるエクセルが起動しているかどうかを調べる命令はないので、エラー監視してひらけばいいんじゃないかと思います。
データを取得した後は閉じておきましょう。
複数ファイルがドロップされたときもちゃんと動くようにしたいですね。

なでしこでエクセルのデータを変数に入れる

元データ

エクセル起動
「D:\えらげ.xlsx」エクセル開く
「A」エクセル最下行取得  //A列の最下行
「A1」から「E{それ}」までエクセル一括取得 //CSVの文字列で返ってくるらしいので
それCSV取得 //配列にする
それ反復
 もし回数ならば、見出し対象「,」配列結合
 対象見出し変数分配
 キャラ名表示
 属性表示
 ロール表示
 「--------」表示

結果

名簿てきなものなので、A列の最下行取得でエクセル一括取得の範囲を広げています。
列もやったほうがいいけど今回は省略。

エクセル一括取得は返ってくる型が文字列なので、CSV取得で配列にします。

変数分配の書式は
(配列)を「変数名,変数名,変数名」に変数分配
こんな感じです。

キャラ名=対象[0]
属性=対象[1]
ロール=対象[2]

と同じ結果になります。

変数分配を使うメリットとしては、元データに列が挿入されてもプログラムを直さなくて済む可能性があることです。

↑元データの2列目にレア度を挿入さえてしまったが

見出しを変数名にしているので結果はかわらない。
内部に変数が増えただけ。

なでしこ1で文字列処理系の命令を使ってみる例

MTGの「稲妻の」で始まるカードを検索した結果のテキストをサンプルに使います。
検索結果を変数 原文 に入れて文字列処理のスタートです

原文=『 英語名:Chain Lightning
日本語名:稲妻の連鎖(いなずまのれんさ)
 コスト:(赤)
 タイプ:ソーサリー
クリーチャー1体かプレインズウォーカー1体かプレイヤー1人を対象とする。稲妻の連鎖はそれに3点のダメージを与える。その後、そのプレイヤーかそのパーマネントのコントローラーは(赤)(赤)を支払ってもよい。そのプレイヤーがそうした場合、そのプレイヤーはこの呪文をコピーし、そのコピーの新たな対象を選んでもよい。
イラスト:Sandra Everingham
 セット:Legends
 稀少度:コモン2


 英語名:Leyline of Lightning
日本語名:稲妻の力線(いなずまのりきせん)
 コスト:(2)(赤)(赤)
 タイプ:エンチャント
稲妻の力線があなたのゲーム開始時の手札にあるなら、あなたはそれが戦場に出ている状態でゲームを始めてもよい。 
あなたが呪文を唱えるたび、プレイヤー1人かプレインズウォーカー1体を対象とする。あなたは(1)を支払ってもよい。そうしたなら、稲妻の力線はそれに1点のダメージを与える。
イラスト:Paolo Parente
 セット:Guildpact
 稀少度:レア


 英語名:Lightning Angel
日本語名:稲妻の天使(いなずまのてんし)
 コスト:(1)(青)(赤)(白)
 タイプ:クリーチャー --- 天使(Angel)
飛行、警戒、速攻
 P/T:3/4
イラスト:rk post
 セット:Time Spiral "Timeshifted"
 稀少度:タイムシフト』

この原文を反復すると、30行あるので30回のループになります。

見た目がすでに段落分けになっているので、3回の処理にしたいですよね?
この場合は「区切る」をしてから反復しましょう。

原文「{改行}{改行}{改行}」区切る
それ反復
  対象言う

これで3個の段落に分かれ、反復は3回となります。
文字列型を反復した時は1行ごとに繰り返すのですが、
「区切る」で要素数3の配列型になっているので3回になります。

ここから日本語名の「稲妻の連鎖」「稲妻の力線」「稲妻の天使」を取り出す場合を考えます

範囲切り取るを使ってみる

とりあえず「日本語名:」から改行まで範囲切り取るを試してみましょうか?

//なでしこv1
原文「{改行}{改行}{改行}」区切る
それ反復
  対象「日本語名:」から改行まで範囲切り取る
  それ表示

結果

稲妻の連鎖(いなずまのれんさ)  
稲妻の力線(いなずまのりきせん)  
稲妻の天使(いなずまのてんし)

ふりがなも一緒きてしまいましたね。まあいいでしょう。

範囲切り取るを使ったので、対象からその部分が削除されるので注意します。

なお、なでしこ3にはまだ範囲切り取るは実装されていないようです。(v3.4.20時点)

正規表現を使ってみる

正規表現では $ が文末なので使ってみます。

原文「{改行}{改行}{改行}」区切る
それ反復
  対象「日本語名:(.*)$」正規表現マッチ
  それ表示

実行結果

日本語名:稲妻の連鎖(いなずまのれんさ)

日本語名:稲妻の力線(いなずまのりきせん)

日本語名:稲妻の天使(いなずまのてんし)

なんか微妙な改行が挟まりましたね…!
これは改行もマッチした部分として取得しているからです。
トリムで後ろの改行コードを消すとよいでしょう。

今回は「日本語名:」の部分はいらないので抽出文字列を使います。
(.*)の部分が変数抽出文字列に入ります

原文「{改行}{改行}{改行}」区切る
それ反復
  対象「日本語名:(.*)$」正規表現マッチ
  抽出文字列トリムして表示

実行結果

稲妻の連鎖(いなずまのれんさ)
稲妻の力線(いなずまのりきせん)
稲妻の天使(いなずまのてんし)

ワイルドカードを使ってみる

ワイルドカードマッチでも処理できます。
ワイルドカードには文末 $ が使えないので{改行}までを指定。
ワイルドカードでも抽出文字列は使えます。

原文「{改行}{改行}{改行}」区切る
それ反復
  対象「日本語名:(*){改行}」ワイルドカードマッチ
  抽出文字列トリムして表示

実行結果

稲妻の連鎖(いなずまのれんさ)
稲妻の力線(いなずまのりきせん)
稲妻の天使(いなずまのてんし)

正規表現よりも暗号っぽさがないのでいいですね。

なお、なでしこ3にはまだワイルドカードマッチは実装されていないようです。(v3.4.20時点)

実用的なツールにする

さて、カードの日本語名を取り出して何に使うか。 たとえばこういうのはどうでしょう

こんなダイアログをだして、1つ選んだら

1段落を言う。
これをやってみましょう。


まず段落ごとの文章を変数にいれます。
カード名をハッシュのキーにして、1段落分のテキストを値にします

検索キャッシュとはハッシュ //ハッシュ(辞書)型
原文「{改行}{改行}{改行}」区切る
それ反復
  対象「日本語名:(*){改行}」ワイルドカードマッチ
  抽出文字列トリム //カード名
  検索キャッシュそれ対象 //検索キャッシュ@カード名=段落

カード名を選択するダイアログはリスト絞込み選択で出すことができます。
上にある枠に文字を入れると選択肢から絞り込みをかけてくれる、本当に使えるやつです。

先の変数からハッシュキー列挙でカード名を列挙し、選択肢とします。

「抜ける」までループ
 検索キャッシュハッシュキー列挙
 それリスト絞込み選択
 もしそれならば抜ける
 検索キャッシュそれ言う //検索キャッシュ@カード名=段落
おわり

今回のプログラム全文

※ なでしこ1

原文『 英語名:Chain Lightning
日本語名:稲妻の連鎖(いなずまのれんさ)
 コスト:(赤)
 タイプ:ソーサリー
クリーチャー1体かプレインズウォーカー1体かプレイヤー1人を対象とする。稲妻の連鎖はそれに3点のダメージを与える。その後、そのプレイヤーかそのパーマネントのコントローラーは(赤)(赤)を支払ってもよい。そのプレイヤーがそうした場合、そのプレイヤーはこの呪文をコピーし、そのコピーの新たな対象を選んでもよい。
イラスト:Sandra Everingham
 セット:Legends
 稀少度:コモン2


 英語名:Leyline of Lightning
日本語名:稲妻の力線(いなずまのりきせん)
 コスト:(2)(赤)(赤)
 タイプ:エンチャント
稲妻の力線があなたのゲーム開始時の手札にあるなら、あなたはそれが戦場に出ている状態でゲームを始めてもよい。 
あなたが呪文を唱えるたび、プレイヤー1人かプレインズウォーカー1体を対象とする。あなたは(1)を支払ってもよい。そうしたなら、稲妻の力線はそれに1点のダメージを与える。
イラスト:Paolo Parente
 セット:Guildpact
 稀少度:レア


 英語名:Lightning Angel
日本語名:稲妻の天使(いなずまのてんし)
 コスト:(1)(青)(赤)(白)
 タイプ:クリーチャー --- 天使(Angel)
飛行、警戒、速攻
 P/T:3/4
イラスト:rk post
 セット:Time Spiral "Timeshifted"
 稀少度:タイムシフト』

検索キャッシュとはハッシュ
原文「{改行}{改行}{改行}」区切る
それ反復
  対象「日本語名:(*){改行}」ワイルドカードマッチ
  抽出文字列トリム
  検索キャッシュそれ対象

「抜ける」までループ
 検索キャッシュハッシュキー列挙
 それリスト絞込み選択
 もしそれならば抜ける
 検索キャッシュそれ言う
おわり

なでしこ1でソシャゲ攻略wikiのまとめを作る

概要

ソシャゲには大量にキャラがいて、攻略wikiはキャラごとに個別ページが作られていることが多いです。
なでしこを使って、これを一覧表にまとめましょう。

目標手順(ざっくり)

全個別ページのキャラ名・URLを配列にいれる
全個別ページをローカルにダウンロードする
各ページから文字列処理で必要な部分を取り出す
表に加工してエクセルに貼り付けする
できあがり

使用する関数

SをSJIS変換
元の文字コードを自動判別してSJISに変換します。 
なでしこ1で文字列処理する場合、SJIS変換しておけばOKです。

SをURLエンコード
日本語をURL欄にあらわれるアレの形(下記に例)に変換します。
文字コードを変えてから実行する必要があるかもしれません。
例)「なでしこ」をURLエンコード //→ %82%C8%82%C5%82%B5%82%B1
例)「なでしこ」をUTF8N変換してURLエンコード //→ %E3%81%AA%E3%81%A7%E3%81%97%E3%81%93

URLをFILEへHTTPダウンロード
URLからHTTPデータ取得
URLを指定してファイルに保存する命令と変数に入れる命令です。
HTMLファイルをDLして処理する場合、SJIS変換が必要になるでしょう

例)urlからHTTPデータ取得してSJIS変換
例)urlをhtmlfileへHTTPダウンロード。htmlfileを開いてSJIS変換

SからAのタグ切り出し
文字列から特定のタグを切り出して配列に入れます。
反復と組み合わせて使います。
imgタグのような、閉じないタグには使用できません(※ の書き方をしている場合はできる様子)

SからAの階層タグ切り出し
 特定のタグの下にあるタグを切り出します。

SのAからBをタグ属性取得
 Aタグのhref属性や、imgのsrc属性を取り出すなどに使います。
例)htmlの「A」から「href」をタグ属性取得

Sからタグ削除
文章からhtmlタグを削除します。

キャラ個別ページの取得

今回はあやかしランブル!くんの攻略wikiからスキル表などを作っていきます。

ayarabu.wikiru.jp

全個別ページのキャラ名・URLを配列にいれる

wikiにはキャラ一覧テーブルがあるのでそのページのhtmlをダウンロードします。

ここ→ 星5キャラクター一覧 - あやかしランブル!(あやらぶ)攻略 Wiki

単にテーブルタグに入っていれば、
「table」のタグ切り出し でターブルタグを取得できます。

テーブルタグが入れ子になっている場合は
「table/table」の階層タグ切り出し を使ってテーブルタグの中のテーブルを取り出します。

よくわからなければ切り取りなどで必要なテーブルの手前を削除してから作業する方法もあります。
その後、テーブルタグ内にあるAタグを取り出して、キャラ名とページURLを表にします。

結果とは変数
url=「https://ayarabu.wikiru.jp/?%E2%98%855」 //★5のキャラ一覧ページ
原文=urlからHTTPデータ取得してSJIS変換  //SJISにしようね
原文から「table/table」階層タグ切り出し //ページの構造による
反復
  もし回数1ならば   //1個目のテーブルタグから
    対象から「a」タグ切り出しして反復  //Aタグを取り出す
      リンク先対象「a」から「href」タグ属性取得してトリム
      キャラ名対象からタグ削除  //Aタグのテキスト部分
      「{キャラ名}{タブ}{リンク先}」結果一行追加
結果メモ記入

実行結果

しかしこのテーブルの中には表自体を編集するボタンがリンクとしてあったり、画像がリンクになっているためきれいな結果にはなりませんでした。

上記の例では一行追加の前に以下の例外処理を入れて良しとしました。

      もしキャラ名ならば続ける //例外処理
      もしキャラ名「編集」ならば続ける //例外処理
      もしキャラ名「追加」ならば続ける //例外処理
      「{キャラ名}{タブ}{リンク先}」結果一行追加

手直しした結果

「{キャラ名}{タブ}{リンク先}」の一覧ができたので、この表を使っていきます。

プログラムを手直しした時に再度ダウンロードしなくて済むように表はファイルに保存しておきます。

結果「一覧表.txt」保存
おわり

全個別ページをローカルにダウンロードする

先ほどの結果をTSV取得して反復で処理します。
各ページのURLは「./なんたらかんたら」となっているので、トップページからの相対パスです。
AをBでURL展開 という命令があるので、URLを生成してダウンロードします。

次の工程で文字コードの問題があるので、HTTPデータ取得してSJIS変換して保存しますかね……

結果「一覧表.txt」開く //「{キャラ名}{タブ}{リンク先}」の一覧
結果TSV取得して反復
  ファイル名「{母艦パス}wiki個別ページ\{対象[0]}.txt」
  URL対象[1]「https://ayarabu.wikiru.jp/」URL展開
  URLHTTPデータ取得してSJIS変換
  それファイル名保存
  1秒待つ

キャラ名にファイル名として使えない文字がある場合、
Sの文字列ファイル名変換 という命令があるのでファイル名に使える文字にすることができます。

キャラ名がそもそもSJISじゃない場合はなでしこ1ではどうにもできない感じです。

短時間に連続ダウンロードするとトテモシツレイにあたるので、1秒待つを入れています。
適切かどうかは自信がないです。

各ページから文字列処理で必要な部分を取り出す

次はダウンロードしたhtmlから基本情報とスキルテーブルを取り出すのですが、ここで問題が発生します。
テーブルタグの中身がセル結合だらけで複雑なのです。

↓スキルが書いてある部分(セル結合は予想)

切り出しがかんたんなのはwikiの編集ページです。
先ほどの個別ページのかわりに編集画面をダウンロードして、textareaタグの中身をローカルに保存します。

wikiの該当ページの編集画面

「|」で区切られた表になっているので、いくらか簡単です。

記述を加工するいろいろ

基本情報テーブルの原文はこんな感じ。

|CENTER:480|CENTER:100|CENTER:150|c
|&attachref(カグツチ.png,zoom,480x0);|~名前|秘めたる焔 カグツチ|
|~|~レアリティ|★5|
|~|~属性|&color(#ff0000){火};|
|~|~武器種|斬撃|
|~|~隊列|前衛|
|~|~タイプ|攻勢|

レア度が5で、属性は火、武器は斬撃で隊列は前衛、タイプは攻勢。
この情報をワイルドカードマッチと抽出文字列でとりだします。

「|~レアリティ|★(#)」でワイルドカードマッチ
 このゲームのレアリティは★1~★5です。
 ワイルドカードの # は数値1文字です。
 ( )でくくって抽出文字列で取り出します。

「|~属性|*([光闇火水風])」でワイルドカードマッチ
 このゲームの属性は「光闇火水風」のいずれかです。
 [光闇火水風]を ( )でくくれば抽出文字列で取り出せます。
 wikiの色指定部分はいらないので*で除外。

「|~武器種|([=斬撃|刺突|打撃|射撃|術具])|」でワイルドカードマッチ
 このゲームの武器種は 斬撃、刺突、打撃、射撃、術具の5種類です。
 [=a|b]でワイルドカードマッチがorの記述方法となります。

前衛・中衛・後衛は「|~隊列|([前中後]衛)|」でワイルドカードマッチ。
タイプは「|~タイプ|([=攻勢|耐久|知略|均衡|救護]*)|」でワイルドカードマッチ。

なでしこは正規表現も使えるので、正規表現マッチでもいいでしょう。

正規表現を使うときの注意

ワイルドカードマッチの「*」と正規表現の「.*」はにているようで動作が異なります。
正規表現の.*は最長一致となります。
正規表現の.*?でワイルドカードマッチと同じような結果になります。
正規表現の|はキーワードなので\|にする必要があります。

//最初の縦棒の間にあるものを調べたい
「|a|b|c|d|」「|*|」ワイルドカードマッチして表示 //→ |a|
「|a|b|c|d|」「\|.*\|」正規表現マッチして表示  //→ |a|b|c|d|
「|a|b|c|d|」「\|.*?\|」正規表現マッチして表示 //→ |a|

記号が渋滞するのでワイルドカードの方が好きです。

エクセルに貼り付けする

あちこちから集めたデータをタブ区切りのテキストにします。
配列に入れた場合は表TSV変換でタブ区切りのテキストになります。

あとはコピー(なでしこの命令)してエクセルに貼り付け(自力)して出来上がり!

1スキル1行の表にした結果、294キャラで2087行になりました。