【報酬あり】 秀丸エディタでマクロを作成


特定のタグだけ抜き出し、文字数をカウントするマクロを作って頂きたいです。

やりたいことは…

Webサイトのソースをコピペしてマクロを実行すると
・bodyタグ内の文字数をカウント
・titleタグを抜き出す
・hタグを抜き出す
の3つを実行するようにしたいです。

大まかな流れは下記のようになると思います。

① <title>~</title><body>~</body>以外の部分を全消去する。

② ①を実行した後、見やすいように少し整形する。
【文字数】
<body>~</body>の間にある文字数を表示
【title】
<title>~</title>の間にある文字を表示
【hタグ】
hタグのみ表示


例として
http://programming-study.com/trouble/hidemaru/
のサイトのソースを全てコピペした状態でマクロを実行するとどうなるようにしたいか?
のファイルをアップロードしましたので、確認をお願いします。

こちらのファイルです
http://35.gigafile.nu/0326-7c270f6e658a9a8f3d53d011d640d692

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2018/03/19 19:32:56
  • 終了:2018/03/20 01:35:26
id:s-takeuchi-0102-gg

補足です

秀丸マクロは、(Excel VBAと比べると劣るかもしれませんが)色々できます。
http://oxynotes.com/?p=3207

HTMLタグ削除&整形マクロ
http://hide.maruo.co.jp/lib/macro/tagdelete.html

対応するHTMLタグへの移動を行うマクロ
http://hide.maruo.co.jp/lib/macro/tagidou.html

特定の文字列をカウントするマクロ
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1329246913


なので今回、実現したい内容としては

「hタグを抽出して整形する」

ができれば、あとは既存のマクロを利用、
または改良することで対応できるとは思います。

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4752ベストアンサー獲得回数20392018/03/19 23:47:42

ポイント1000pt

Bookmarklet でも良いということでしたので、書いてみました。

(function() {
    const d_ = document;

    Array.prototype.forEach.call(d_.body.querySelectorAll("script,style,noscript"), function(e) {
        e.parentNode.removeChild(e);
    });

    const text = d_.body.textContent.replace(/\s+/g, "");
    const count = text.length;
    const title = d_.title;
    const hx_list = d_.querySelectorAll("h1,h2,h3,h4,h5,h6");

    const panel = d_.body.appendChild(d_.createElement("textarea"));
    panel.style.position = "fixed";
    panel.style.backgroundColor = "white";
    panel.style.border = "1px solid black";
    panel.style.padding = "1ex";
    panel.style.top = "0";
    panel.style.width = "80ex";
    panel.style.height = "20em";
    function indent(tag) {
        let n = parseInt(tag.replace(/^H/, "")) - 1;
        let pad = "";
        for (let i = 0 ; i < n ; ++i) {
            pad += "\t";
        }
        return pad;
    }
    panel.value = [
        "【文字数】",
        count,
        "\n【title】",
        title,
        "\n【hタグ】",
        Array.prototype.map.call(hx_list, function(h) {return indent(h.tagName) + h.tagName + ":" + h.textContent;}).join("\n"),
    ].join("\n");
})();

Firefox でしか動作確認をしていませんが、Google Chrome や Edge なら動くと思います。


はてなには、Hatena::Let という Bookmarklet をホスティングするサービスがあるので、そこにも置きました。
http://let.hatelabo.jp/a-kuma3/let/hJmfy_yqmbJ2

f:id:a-kuma3:20180319234026p:image

赤で括ったあたりを右クリックでブックマークしてください。


データを抽出したいページを表示した後に、ブックマークした Bookmarklet をクリックして実行してください。
質問で挙げられたページだと、こんな感じで抽出結果を表示します。

f:id:a-kuma3:20180319234127p:image


TEXTAREA で表示しているので、クリックして ctrl+A で全選択して、ctrl+C でコピーできます。

他8件のコメントを見る
id:a-kuma3

ぼくの都合で、Hatena::Let に置いた Bookmarklet の URL を変えました。
http://let.hatelabo.jp/a-kuma3/let/hLHUyoDNoMc7

取りなおすときは、↑からお願いします。

2018/03/23 08:29:38
id:s-takeuchi-0102-gg

かしこまりました!

2018/03/23 09:35:01

その他の回答(0件)

id:a-kuma3 No.1

a-kuma3回答回数4752ベストアンサー獲得回数20392018/03/19 23:47:42ここでベストアンサー

ポイント1000pt

Bookmarklet でも良いということでしたので、書いてみました。

(function() {
    const d_ = document;

    Array.prototype.forEach.call(d_.body.querySelectorAll("script,style,noscript"), function(e) {
        e.parentNode.removeChild(e);
    });

    const text = d_.body.textContent.replace(/\s+/g, "");
    const count = text.length;
    const title = d_.title;
    const hx_list = d_.querySelectorAll("h1,h2,h3,h4,h5,h6");

    const panel = d_.body.appendChild(d_.createElement("textarea"));
    panel.style.position = "fixed";
    panel.style.backgroundColor = "white";
    panel.style.border = "1px solid black";
    panel.style.padding = "1ex";
    panel.style.top = "0";
    panel.style.width = "80ex";
    panel.style.height = "20em";
    function indent(tag) {
        let n = parseInt(tag.replace(/^H/, "")) - 1;
        let pad = "";
        for (let i = 0 ; i < n ; ++i) {
            pad += "\t";
        }
        return pad;
    }
    panel.value = [
        "【文字数】",
        count,
        "\n【title】",
        title,
        "\n【hタグ】",
        Array.prototype.map.call(hx_list, function(h) {return indent(h.tagName) + h.tagName + ":" + h.textContent;}).join("\n"),
    ].join("\n");
})();

Firefox でしか動作確認をしていませんが、Google Chrome や Edge なら動くと思います。


はてなには、Hatena::Let という Bookmarklet をホスティングするサービスがあるので、そこにも置きました。
http://let.hatelabo.jp/a-kuma3/let/hJmfy_yqmbJ2

f:id:a-kuma3:20180319234026p:image

赤で括ったあたりを右クリックでブックマークしてください。


データを抽出したいページを表示した後に、ブックマークした Bookmarklet をクリックして実行してください。
質問で挙げられたページだと、こんな感じで抽出結果を表示します。

f:id:a-kuma3:20180319234127p:image


TEXTAREA で表示しているので、クリックして ctrl+A で全選択して、ctrl+C でコピーできます。

他8件のコメントを見る
id:a-kuma3

ぼくの都合で、Hatena::Let に置いた Bookmarklet の URL を変えました。
http://let.hatelabo.jp/a-kuma3/let/hLHUyoDNoMc7

取りなおすときは、↑からお願いします。

2018/03/23 08:29:38
id:s-takeuchi-0102-gg

かしこまりました!

2018/03/23 09:35:01
id:s-takeuchi-0102-gg

ありがとうございます!このBookmarkletをクリックすると左上に窓が出現しますが、これを閉じるにはタブを閉じるしかないのでしょうか?

  • id:a-kuma3
    目的のデータを抽出することと、秀丸のマクロで実装することと、どちらを重要視しますか?
  • id:s-takeuchi-0102-gg
    コメントありがとうございます。秀丸のマクロでやることを優先したいです。
    (エクセルVBA等なら実現しやすいとは思いますが、あくまで秀丸マクロにこだわっています)
  • id:a-kuma3
    >秀丸のマクロでやることを優先したいです
    それは、残念。
    回答がつくと良いですね。
  • id:s-takeuchi-0102-gg
    やはり、秀丸マクロでは難しいのでしょうか…
    回答を待ちます。
  • id:a-kuma3
    タグの中に ">" が入った場合とか考えると、頭痛くなりますね。
    script タグがうまく除去できないのも、理由はそんなところではないでしょうか。
    VBA でも、素の VBA でやれと言われると、げっそりします。
  • id:s-takeuchi-0102-gg
    そうなんですね…

    HTMLタグ削除&整形マクロ
    http://hide.maruo.co.jp/lib/macro/tagdelete.html

    である程度は対応できているので、script タグが除去できないのはあきらめます。

    それなら対応可能でしょうか?
    それとも、やはりエクセルVBAのほうがいいですか?
  • id:a-kuma3
    ぼくなら、javascript でやります。
  • id:s-takeuchi-0102-gg
    javascriptですか。

    ちょっとイメージが沸かないのですが、デスクトップ上にjavascriptのアイコンがあって、
    HTMLソースをコピペしたテキストファイルをドラッグ&ドロップすると、文字数カウント&hタグを抜き出す

    …といった感じでしょうか?
  • id:a-kuma3
    Bookmarklet というのでやります。
    ブックマークの URL に javascript のコードを書いて、実行したいページで そのブックマークをクリックすると、そのコードを実行できます。
    編集結果は、表示しているページの中に表示したりとかできます。

  • id:s-takeuchi-0102-gg
    いまbookmarkletについて調べたのですが、chromeなどのブラウザ上で直接、実行できるんですね。
    http://book.tsuhankensaku.com/hon/bookmarklet-googlechrome.html
    これなら私にもできそうです。

    作成お願いしてよろしいでしょうか?

    また可能なら、書いたコードは
    GIGAファイル便
    http://gigafile.nu/
    にアップして頂けると嬉しいのですが…

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません