人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

やりたいことは…

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

●質問者: shingm
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

補足です

秀丸マクロは、(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タグを抽出して整形する」

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


1 ● a-kuma3
●1000ポイント ベストアンサー

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 でコピーできます。


a-kuma3さんのコメント
>> このBookmarkletをクリックすると左上に窓が出現しますが、これを閉じるにはタブを閉じるしかないのでしょうか? << ページを reload すれば、Bookmarklet は無かったことになります。 要るかなあ、とはちらっと思ったのですが、script タグとかを削除したりしてて、元のページとは違った状態になっちゃっているので、ただ閉じても、元のページとは違っちゃってるんですよね。 因みに、質問の意図から body の文字数として余計だと思われる script、style、noscript タグを消してから文字数をカウントしています。

shingmさんのコメント
あ、閉じてもページが変わってしまうのですね。わかりました。 >因みに、質問の意図から body の文字数として余計だと思われる >script、style、noscript タグを消してから文字数をカウントしています。 純粋に、サイト上に表示される文字数をカウントしているという事ですよね。 質問の意図まで汲んで頂いて非常に助かりました。 この度は大変ありがとうございました!

shingmさんのコメント
すみません、このBookmarklet、実行するたびに出力される文字数が異なります。 しかkりページの読み込みが終わってから実行しましたが、5300だったり4800だったりします。 これはどういう理由ですか? 修正できるなら、修正して頂けると嬉しいのですが…

a-kuma3さんのコメント
連続して実行すると、抽出したデータの文字数もカウントしちゃうんです。 body の下に入れてますから(じゃないと見えない)。 実際にデータを抽出する際には、あまり問題にはならないと思うんですが(修正できなくはないです)。

a-kuma3さんのコメント
ページを表示して一発目の文字数が違う、というケースに遭遇しているのであれば、そのページが javascript で動的に(ソースとして確認できない内容を追加してる)可能性もあります。 こちらは、そのページによるので、一呼吸おいてから実行するくらいしか、回避方法がありません(遅いページもあるので)。

shingmさんのコメント
コードの問題ではないのですね。わかりました。これは大丈夫です! あと、何度もすみません。 https://mens.tasclap.jp/a1569 こちらのサイトで Ctrl + A でテキストを全選択コピーしてカウントした文字数は「8384」ですが Bookmarklet を実行すると「11619」と出ます。 これは、どういう原因でしょうか? もし可能であれば、テキストをコピーした文字数に近い値を出力したいです。 お手数をお掛けして申し訳ありません…

a-kuma3さんのコメント
>> これは、どういう原因でしょうか? << マウスカーソルを重ねて初めて見えるような文字とか、そういうのも Bookmarklet ではカウントしてます。

shingmさんのコメント
そうなんですね。 いくつかのサイトで確認しました。 たまに文字数がずれるサイトもありますが、大体うまくいきますね! これで運用してみます。 このたびは大変ありがとうございました!

a-kuma3さんのコメント
ぼくの都合で、Hatena::Let に置いた Bookmarklet の URL を変えました。 http://let.hatelabo.jp/a-kuma3/let/hLHUyoDNoMc7 取りなおすときは、↑からお願いします。

shingmさんのコメント
かしこまりました!

質問者から

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


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ