extract-content-javascriptを使用して、本文っぽい箇所のテキストを抜き出してみる実験。
/*******************************************************************************
* 【注意】
* 外部参照のJavaScriptファイルを読み込んでいます。
* このサンプルを組み込んだプログラムを不特定多数に配布する場合、
* http://hsp.moe/js/extract-content-all.js
* を外部参照しないようにしてください。
* 要するに、外部参照しているサーバーに負荷をかけないでください。ということです。
* 開発者自身がテスト目的で動作させる用途であれば問題ありません。
*
* 外部参照するアドレスを変更するか、createElementでJavaScriptを動的挿入する際に
* text属性に直接挿入する手段があります。
* http://zombiebook.seesaa.net/article/22810383.html
*
*【使用ライブラリ】
* extract-content-javascript(MIT License)
* http://hatena.g.hatena.ne.jp/hatenabookmark/20091007/1254885271
*
*******************************************************************************/
#include "user32.as"
#define WM_TIMER 0x0113
#define TIMER_EXTRACTED 1
#define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}"
#define DISPID_DOCUMENTCOMPLETE 259
oncmd gosub *OnWMTimer, WM_TIMER
onexit gosub *exit
axobj pIeObj, "Shell.Explorer.2", 640, 480
ieObjIdx = stat
comevent ieEvent, pIeObj, DIID_DWebBrowserEvents2, *event
pIeObj("Silent") = 1
pIeObj->"Navigate" "http://gigazine.net/news/20150425-mapfan-app-windows/"
screen 2 : title "結果"
sdim result
mesbox result, 640, 480, 0, 0
mesBoxObjIdx = stat
gsel 0, 1
stop
*exit
if 2 = wparam{
gsel 2, -1
return
}
end : end
return
*event
dispid = comevdisp(ieEvent)
if DISPID_DOCUMENTCOMPLETE == dispid {
gosub *OnDocumentComplete
}
return
*OnDocumentComplete
comevarg docUrl, ieEvent, 1, 1
if pIeObj("LocationURL") == docUrl{
pIeDoc = pIeObj("document")
// 結果格納用
comres pIeCreEle
pIeDoc->"createElement" "div"
comres pIeCreText
pIeDoc->"createTextNode" ""
pIeCreEle->"appendChild" pIeCreText
pIeCreEle->"setAttribute" "id", "extract-content-hsp"
pIeDocBody = pIeDoc("body")
pIeDocBody->"appendChild" pIeCreEle
// 解析実行
comres pIeCreEle
pIeDoc->"createElement" "script"
pIeCreEle("type") = "text/javascript"
// JavaScript挿入
pIeCreEle("text") = {"
var d = document;
var s = d.createElement('script');
s.src = 'http://hsp.moe/js/extract-content-all.js'
d.body.appendChild(s);
var i = setInterval(function ()
{
if (!window.ExtractContentJS) {
return;
}
clearInterval(i);
var ex = new ExtractContentJS.LayeredExtractor();
ex.addHandler(ex.factory.getHandler('Heuristics'));
var res = ex.extract(d);
if (res.isSuccess) {
document.getElementById('extract-content-hsp').innerText = res.content.toString();
}
}, 50);
"}
pIeDocBody = pIeDoc("body")
pIeDocBody->"appendChild" pIeCreEle
gsel 0, 0 : SetTimer hwnd, TIMER_EXTRACTED, 50, 0
timeOutCnt = 0
delcom pIeCreEle
delcom pIeCreText
delcom pIeDocBody
delcom pIeDoc
}
return
*OnWMTimer
if TIMER_EXTRACTED == wparam {
gosub *extracted
}
return
*extracted
// タイムアウト
if 10 < timeOutCnt{
gsel 0, 0 : KillTimer hwnd, TIMER_EXTRACTED
result = "解析に失敗しました。タイムアウトになりました。"
gsel 2, 1 : objprm mesBoxObjIdx, result : gsel 0, 0
return
}
comres extractContent
pIeDoc = pIeObj("document")
pIeDoc->"getElementById" "extract-content-hsp"
if "" != extractContent("innerText"){
gsel 0, 0 : KillTimer hwnd, TIMER_EXTRACTED
result = extractContent("innerText")
gsel 2, 1 : objprm mesBoxObjIdx, result : gsel 0, 0
}
delcom extractContent
delcom pIeDoc
timeOutCnt++
return