HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0425
ぬねのHTMLから本文だけを抽出したい12解決


ぬねの

リンク

2015/4/25(Sat) 13:19:57|NO.68744

こんにちは、ぬねのです。

今まとめサイト等のHTMLから本文だけ抽出するためのソフトを考えています。
なぜかと言いますと、私は愛用していたとあるAndroidアプリが一年ほど前に公開を停止し、
代替アプリも無くそのまま使用していたのですが、とうとう動作不可に....
それなら自分で(Windows用でもいいから)作ってしまえ!ということになったのですが、いまいち本文の抜き出しがよく分かりません。
どうもHSPでは(個人的に)難しいことだと思っているのですが、どのような方法が考えられるでしょう?
自分的にはtidy.dllを用いたほうがいいかと思い参考になりそうなものを探してみましたがどうも理解できず...
何かいい方法が有りましたら教えてくださるとありがたいです。
よろしくお願いします。



この記事に返信する


ooo

リンク

2015/4/25(Sat) 17:00:03|NO.68748

これでどうでしょう

axobj ie, "Shell.Explorer.2",640,480 ie->"Navigate" "http://hsp.tv/play/pforum.php?mode=all&num=68744" repeat wait 20 if ie("busy")==0 & ie("ReadyState")==4 :break loop doc=ie("document") body=doc("body") dialog body("innerText") stop



ぬねの

リンク

2015/4/25(Sat) 18:04:57|NO.68749

>ooo さん
ありがとうございます。
bodyのみ切り出しする方法を初めて知りました。
ありがとうございます。

ですが私が今欲しているのは
Evernote Web Clipperにある「記事」モードでの抽出みたいな感じです。

まとめサイトなどの本文のみ抽出と言ったほうがいいのでしょうか?



ooo

リンク

2015/4/25(Sat) 18:45:04|NO.68752

違いましたか。
>Evernote Web Clipperにある「記事」モードでの抽出みたいな感じです。
>まとめサイトなどの本文のみ抽出と言ったほうがいいのでしょうか?
あいにくEvernote Web Clipperやまとめサイトなるものを知らないので検索してもピンとこないです。
もうちょっと具体的にどういうものか記述があればほかの人からも情報が得られるかもしれないです。



skyblue

リンク

2015/4/25(Sat) 19:36:44|NO.68754

BODYタグを抽出できたらそっから本文だけをタグ解析などをおこなって
抽出すれば良いだけです。



ぬねの

リンク

2015/4/25(Sat) 20:16:34|NO.68758

https://docs.google.com/file/d/0B9GXpc0d50L_by0zZDlraHdyOWc/edit
上記画像のように本文のみを抽出したいのです。(出来れば画像も)
(上記画像で使用しているのがEvernote Web Clipperです。)
(使用したサイト http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%B9%E3%82%A8%E3%82%B0%E3%83%A9)

また、もしbodyから抽出する場合、まとめサイトの場合だと、fc2ブログやlivedoor、最近ではニコニコチャンネルでも若干構成が異なるため、どのように"本文"や"画像"を識別するべきかよく分かりません。
自分自身HSPは慣れはじめましたがHTMLはまだまだ未熟なので出来れば教えていただけると助かります...
(どうもHTMLは苦手....)



ht_ask

リンク

2015/4/25(Sat) 20:38:44|NO.68761

JavaScriptか何かでDOMノードの座標を得るとして、
兄弟関係かつ並列している要素のうち幅の狭い方を捨てるという方法を考えました。
参考画像程度の精度ならそれで十分のような気もしますが、ベターな方法もあるかもしれません。



ooo

リンク

2015/4/26(Sun) 07:51:03|NO.68783

ウィキペディアのページなら以下でそれっぽいことがきますけどどんなページでも通用するような
汎用的な方法とかは難しいですね。

screen 0,1000,800 axobj ie, "Shell.Explorer.2",1000,800 ie->"Navigate" "http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%B9%E3%82%A8%E3%82%B0%E3%83%A9" repeat wait 20 if ie("busy")==0 & ie("ReadyState")==4 :break loop doc=ie("document") body=doc("body") content=doc("getElementById","content") body("innerHTML")=content("innerHTML")



Taddi

リンク

2015/4/26(Sun) 09:50:40|NO.68785

さくらさんのウェブページ、下記リンクのNo.42が参考になると思います。

http://hspnext.com/hspkura/hspkura11.htm



inovia

リンク

2015/4/26(Sun) 12:09:03|NO.68790

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



ぬねの

リンク

2015/4/26(Sun) 12:53:24|NO.68791

>inovia さん
わざわざこんなことにJSまで書いてくださりありがとうございます!取得精度は完璧です!
一度試しに実行してみたのですが、返ってくるのはテキストだけなのでしょうか?
出来れば画像を一緒に拾ってみたいのですが(おせっかいで申し訳ありません...)

>Taddi さん
サイトを拝見しました。
タグの除去なんて方法もあるのですか!他にも応用できそうですね。参考にします!

>ooo さん
似たような方法を模索していましたが
>doc("getElementById","content")
こんな方法とは...ちょっとリサーチ不足(?)でした...

(どうも文章が余り上手ではないので読みにくかったりしたら申し訳ありません...)



inovia

リンク

2015/4/26(Sun) 22:41:41|NO.68800

こんな感じかな?
先ほどと違って、元のHTMLを書き換えます。


/******************************************************************************* * 【注意】 * 外部参照の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 * *******************************************************************************/ #define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" #define DISPID_DOCUMENTCOMPLETE 259 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/" stop *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" "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) { d.body.innerHTML=res.content.asNode().innerHTML; } }, 50); "} pIeDocBody = pIeDoc("body") pIeDocBody->"appendChild" pIeCreEle delcom pIeCreEle delcom pIeDocBody delcom pIeDoc } return



ぬねの

リンク

2015/4/28(Tue) 09:27:23|NO.68823

>inovia さん
そうですコレです!ありがとうございます!
本当にありがとうございました!
(JSは私の低性能は鯖にでも置いて実行してみます)



ONION software Copyright 1997-2023(c) All rights reserved.