May 30, 2007
HTMLドキュメントを解析して特徴的なループを見つけるBookmarklet
- 全てのDOMノードを列挙する
- ノードは次のように文字列化される。
直前の階層までは添え字つき、最後のノードはタグ名のみにする。
class名、id名は排除する。各々のサイトのルールで記述されたruleよりも
タグのネスト構造の方が変化に強いし機械的に抽出しやすいのではないか?
出現回数でソートする。li要素2-5はループであることが分かる。
しかし、例えばリストの中に複数のリンクが含まれていた場合は、
というようなループも見つけることができるだろう。
この場合は「より短いパスでのループ」の方がスコアが高くなるようにする。
ループと思われるノード
この場合は/html[0]/body[0]/div[0]/div[0]/ul[0]/liの中身を解析する
例えばこんな感じに。
- そのノードの配下に含まれる文章の長さが大きいほどスコアが加算される。
- link rel="next"から次のページを取得、同様に解析を行ってtextの内容で重複をチェックする
-- 例えば10件中9件が同じであればスコアを0.1倍に減らす。
-- 変化がないループはタグクラウドのような共通のパーツであると考えられる。
-- 次のページを見たときに内容が変化している箇所がメインコンテンツ部分。
-- ループから見て一つ親のノードがページの主要なコンテンツであると考えられる。
- offsetHeight,offsetWidthを使って描画サイズを調べる?ただしブラウザじゃないと無理。
というようなことを昨晩思いついたのでとりあえず、JavaScriptで書いてみた。
コードはこんな感じ、今のところ重み付けはなくて出現回数のカウントだけ。
http://la.ma.la/misc/js/guess_loop.js
ブックマークレットにして試せるようにしてみたのがこちら。
guess loop
書き忘れ、forEachとか使ってるのでFirefoxオンリーです。
- ノードは次のように文字列化される。
0: /html[0]/body[0]/div 1: /html[0]/body[0]/div[0]/div 2: /html[0]/body[0]/div[0]/div[0]/ul[0]/li 3: /html[0]/body[0]/div[0]/div[0]/ul[0]/li 4: /html[0]/body[0]/div[0]/div[0]/ul[0]/li 5: /html[0]/body[0]/div[0]/div[0]/ul[0]/li
直前の階層までは添え字つき、最後のノードはタグ名のみにする。
class名、id名は排除する。各々のサイトのルールで記述されたruleよりも
タグのネスト構造の方が変化に強いし機械的に抽出しやすいのではないか?
出現回数でソートする。li要素2-5はループであることが分かる。
しかし、例えばリストの中に複数のリンクが含まれていた場合は、
/html[0]/body[0]/div[0]/div[0]/ul[0]/li[3]/a[0] /html[0]/body[0]/div[0]/div[0]/ul[0]/li[3]/a[1] /html[0]/body[0]/div[0]/div[0]/ul[0]/li[3]/a[2] /html[0]/body[0]/div[0]/div[0]/ul[0]/li[3]/a[3]
というようなループも見つけることができるだろう。
この場合は「より短いパスでのループ」の方がスコアが高くなるようにする。
ループと思われるノード
この場合は/html[0]/body[0]/div[0]/div[0]/ul[0]/liの中身を解析する
例えばこんな感じに。
[
{level:6, length:(下位のtextNodeのlengthの合計), text: textNodeを連結したもの }
{level:6, length:(下位のtextNodeのlengthの合計), text: textNodeを連結したもの }
{level:6, length:(下位のtextNodeのlengthの合計), text: textNodeを連結したもの }
]
- そのノードの配下に含まれる文章の長さが大きいほどスコアが加算される。
- link rel="next"から次のページを取得、同様に解析を行ってtextの内容で重複をチェックする
-- 例えば10件中9件が同じであればスコアを0.1倍に減らす。
-- 変化がないループはタグクラウドのような共通のパーツであると考えられる。
-- 次のページを見たときに内容が変化している箇所がメインコンテンツ部分。
-- ループから見て一つ親のノードがページの主要なコンテンツであると考えられる。
- offsetHeight,offsetWidthを使って描画サイズを調べる?ただしブラウザじゃないと無理。
というようなことを昨晩思いついたのでとりあえず、JavaScriptで書いてみた。
コードはこんな感じ、今のところ重み付けはなくて出現回数のカウントだけ。
http://la.ma.la/misc/js/guess_loop.js
ブックマークレットにして試せるようにしてみたのがこちら。
guess loop
書き忘れ、forEachとか使ってるのでFirefoxオンリーです。
WriteBacks
Posted by at 2007/05/30 (Wed) 22:11:08
HTMLはアフィリエイトの必修項目
HTMLとは、「Hyper Text Markup Language(ハイパーテキスト・マークアップ・ランゲージ)」の略で、ウェブページを作成するためのマークアップ言語です。
Posted by HTMLはアフィリエイトの必修項目 at 2007/06/23 (Sat) 20:35:57
はじめまして
スクールやレッスン、資格等の情報も掲載しております。
尚、このトラックバックがもし必要ではない内容でしたらお手数ですが、削除お願いします。
失礼致します。
m( __ __ )m
Posted by マナブならCOCOガイド at 2007/08/24 (Fri) 21:05:44
Posted by adaruto at 2008/10/21 (Tue) 14:52:35
http://la.ma.la/blog/diary_200705301424.trackback
writeback message: Ready to post a comment.

