Readabilityの代替 Defuddleとは? HTMLをMarkdownに変換
引用元:https://news.ycombinator.com/item?id=44067409
最近これ調べてたんだけど、Readabilityの各言語実装には正直イマイチだったんだよね。Readability.jsが一番マシだったけど、Javascriptってのがプロジェクトに合わなくてさ。結局、python trifaturaってライブラリが見た感じ一番精度高くて、メタデータも正確だったんだ。君の実装とtrifaturaを比べてみたら、改善点が見つかるかもよ。
>…Javascriptなのがプロジェクトに合わなかった”についてだけどさ、もしGo使ってるなら、Readability[0]とTrafilatura[1]のGoポートを俺がメンテしてるんだよ。これらは積極的にメンテされてて、Trafilaturaの方はPython版と遜色ないパフォーマンスだよ。
[0]: https://github.com/go-shiori/go-readability
[1]: https://github.com/markusmobius/go-trafilatura
俺たちもgo-trafilaturaずっと使ってるけど、めちゃくちゃ気に入ってるよ。
これこれ!これ見たかったんだよ、ありがとう!
ライブラリへの参照:https://trafilatura.readthedocs.io/en/latest/
知りたい人向け:Trafilaturaはイタリア語で”押し出し”って意味だよ。|この方法は多孔質の表面を作って、パスタがソースをすごくよく絡むようにするんだ。maccheroni trafilatiとmaccheroni lisciで検索してみてね:)(そういえば、trifaturaじゃなくてTrafilaturaって言いたかったんだと思うよ)
最初から使ってるけど、2.0.0以降開発がかなり止まっちゃってるんだよね。
ちょっと古いけど、何年か前にいくつかのウェブ抽出ツールのベンチマークやったんだ。https://github.com/Nootka-io/wee-benchmarking-tool
その時はresiliparse-plainが断トツの勝者だったよ。
ちょうどobsidian web-clipperのソースコード見てたんだ。Markdown変換の結果がすごく良かったから impressed してたんだけど、そこでDefuddleを見つけたんだよ。自作のread-it-later/ knowledge-baseアプリで使う予定だから、事前にありがとうね:D
obsidian clipperは出た初日から使ってるけど、これは本当にすごいね。サイトごとのプロファイルベースの抽出が最高だよ。たとえobsidianユーザーじゃなくても、Markdown抽出の品質はこれまで見た中で一番信頼できるね。
情報ありがとう!
良い仕事だね.JSDOMの例が助かるよ,まさにReadabilityみたいに使う方法だからね,これ良いドロップイン代替になりそう.
質問なんだけど: これどうやって検証したの? Readabilityより良いって言うけど,精度とか網羅性を評価するテストやデータセットがリポジトリにないみたいだけど.それも共有できる?
今は手動テストとユーザーフィードバックに頼ってるんだけど,うん,テストは追加したいと思ってるよ.
DefuddleはReadabilityとはかなり違う動きをするんだ.Readabilityは用心深すぎて,メインコンテンツの開始と終わりを見つけるためにブロックをテストするから,役に立つコンテンツまで削除しがちだね.
Defuddleは複数回実行できて,コンテンツが返されなかった場合に結果を広げるように試せるんだ.コンテンツをきれいにするのに,より多様な技術も使うよ ー 例えば,ページのモバイルスタイルを使って非表示にできるコンテンツを検出したりね.
最後に,Defuddleはコンテンツを抽出するだけでなく,出力も標準化してるんだ(これはReadabilityはやらないこと).例えば脚注やコードブロックは全部一つのフォーマットで出力することを目指してるんだけど,Readabilityは元のDOMをそのままにするんだ.
これすごいね! Readabilityの代替としてDefuddleを試したいんだけど,私のユースケースだとChrome拡張のバックグラウンドスクリプト(サービスワーカー)でやりたいんだ.Readabilityは動くのに,Defuddleが動かせないでいるんだ(linkedomと組み合わせた時).つまり,これは動くのに: import { parseHTML } from ’linkedom’;
…
private extractArticleWithReadability(html: string) {
const { document } = parseHTML(html);
const reader = new Readability(document);
return reader.parse();
}
これは動かないんだ: import { parseHTML } from ’linkedom’;
…
private async extractArticleWithDefuddle(html: string) {
const { document } = parseHTML(html);
const result = new Defuddle(document);
result.parse();
return result;
}
こういうエラーが出るんだ:
- Error in findExtractor: TypeError: Failed to construct ’URL’: Invalid URL
- Defuddle: Error evaluating media queries: TypeError: undefined is not iterable (cannot read property Symbol(Symbol(Symbol.iterator)))
- Defuddle Error processing document: TypeError: b.getComputedStyle is not a function
Chrome拡張のバックグラウンドスクリプト/サービスワーカーでDefuddleを動かす方法ってある? それとも,そのためのサポートを追加する予定はある?
Obsidian Web Clipperって,chatGPTの会話をmarkdownにしたり,印刷したりするのにすごく良いツールだよ(マジで,そういうユースケースもあるんだ).
他のクライアントについては分からないけど,Kagi Assistantは直接会話をMarkdownで保存できる機能があるよ.Obsidianのウェブクリッパーも良いアイデアだけどね.
ChatGPTに,必要なサマリーとかをmarkdownファイルとして提供してって,直接お願いしちゃうよ.
無料のオープンソースだよ: https://github.com/obsidianmd/obsidian-clipper
MozillaのReadabilityって本当に放棄されたの? 最新リリース(v0.6.0)はたった2ヶ月前だし,そのメンテナー(Gijs)も問題への対応にかなりアクティブみたいだけど.
正直言ってあのコードベースは改善点ありまくりだね.仕事でバグ(数字のカンマ誤認識とか)直すためにフォークしたくらい.プルリクもテスト必須なのにテスト自体が動かないし.個人的にはもう問題だらけって感じ.
これは多分 https://github.com/mozilla/readability/pull/853#issuecomment… のことだね.彼らの要求はかなり合理的だと思うよ.
うーん,もしかしたら問題に近すぎんのかな,分かんないけど.ツール使おうとしてうまく動かないのはいつもイライラするよね.無料なのは分かってるけど,やっぱ良い貢献をしてもらえるように手助けするのが,メンテとかバグ修正には一番大事な気がするんだ.カンマ問題は絶対バグなのに,直そうって気がないのがちょっと残念だし,だからこのリポジトリは死にかけだと思うんだよ.
”パッチがちゃんと動くこと,そして将来それを壊さないことを確実にしたい”っていう言葉を”直す気がない”ってどう解釈できるのか,僕には分からないな.まあ,君は君の考え方でいいけどね.
Python版のReadabilityはメンテしっかりされてるみたいだね.何年か前に自分でReadabilityアルゴリズムを実装したことあったけど,そっちに乗り換えたんだ.いくつかスクレイパー動かしてるけど,定期的にアップデートされてて調子いいよ.
具体的にどれかおすすめある?
親コメントじゃないけど,これがメンテされてるみたいだよ https://github.com/buriy/python-readability
Substance [^0] っていう似たプロジェクト作ったよ.たいていのReadabilityツールと違って,サイトごとに処理方法を定義できるフレームワークなんだ.だから対応サイトごとに質の高い結果が出せるんだよ.[^0]: https://substance.reorx.com/
真面目な質問なんだけど,誰が何のためにこのツール使うの?具体的なユースケースって何?他のコメントだと ChatGPT の会話をmdにエクスポートするくらいしか見なかったんだけど.
これはツールじゃなくてライブラリだよ.色々な用途に使えるんだ.
- サイト訪問者に”リーダーモード”提供
- ブラウザ拡張機能で使う
- スクレイピング
- [リバース] プロキシに組み込んでページ軽量化(例えば retro hardware 向け)
詳しい例はこちら:https://web.archive.org/web/20240621144514/https://humungus…. (サイトがよく落ちるからアーカイブね)
LogSeqをよく使ってるんだけど、ウェブサイトからテキストだけをMDで抜き取れるオプションは、LogSeqとめっちゃ相性良さそう。
リーダー機能が効かないサイトがあるの知ってる?普通の記事でテキストいっぱいなのに、iPhoneのリーダーで開くと真っ白になるんだ。ニュースサイトに多いかな。
これって広告表示させるために、サイト側がわざとコンテンツを見えなくしてるの?だとしたらどうやってるんだろう?
もっとコメントを表示(1)
クッキーとかプライバシーに関するバナーが原因のことが多いよ、特にEUとかUK、カリフォルニアとかね。
サイトによってはコンテンツを覆うだけのモーダルだからリーダーモードで対処できるけど、リダイレクトされたりサーバー側で処理されてたりするとダメなんだ。
リーダーモードが効かないなら、まずバナーを閉じてからもう一回試してみて。
これめっちゃいいね!最近のサイトってごちゃごちゃしてて情報過多だから、読者がコンテンツを読むのに集中できるような強力なMarkdownコンバーターが本当に必要とされてるんだよね。
Readabilityがいなくなった穴を埋めるものが出てきて嬉しいよ。この仕事を引き継いでくれてありがとう :-)
プレイグラウンドでURLを入力した後、どうやって送信してURLを取得するのか分からないんだけど?iOSキーボードでエンターキーを押しても何も起こらないんだ。何か見落としてるのかな?
あの入力欄はURLオプションをテストするために置いたものなんだ―ちょっと分かりにくかったから、今は削除したよ。GitHub Pagesからリクエストをプロキシする良くて無料の方法がまだ見つかってないんだよね。
試してみるよ。今使ってるWYSIWYGエディタのMarkdownからHTMLへの変換設定に満足してないんだ。自分でツールバーとかエディタを作ったら、こっちの方が良い結果を出してくれるかもね。
似たようなものをPHPで作ったことがあるよ。
https://devkram.de/markydown
自分でホストするのに簡単だよ。
Readabilityがもうダメそうだってのは間違いないね。SlurpっていうObsidianプラグインで使ってたんだけど、これはweb clipperと同じ目的で、PRのレビューとかマージがいつも大変だったんだ。
自分で代替を作ろうとしたんだけど、人生(とweb clipper)で頓挫しちゃった。面白いことに、web clipperがあるのにSlurpはなぜかユーザーが増え続けてるんだよ。だから近いうちに、もうSlurpは使ってないけど、君のライブラリを使うようにリファクタリングしないといけないかもね。
いいね。僕はHTMLメールから署名とか定型的な免責事項を削除するのに似たようなものを探してるんだ。これってそれに使えるかな?
裏でAIモデル使ってるの?コードにGeminiとか見かけたんだけどさ.Readabilityと比べてコストどうなのかなって知りたくて聞いてるんだ.サンキュー!
いやいや,全部ルールベースだよ.「extractors」ってコードのことかな?あれはコメントスレッドがあるサイト(例えばHN,Reddit)とか,会話型のチャット(ChatGPT,Claude,Gemini)の出力を統一するためのサイト別ルールなんだ.今ちょうど開発中だよ.
主要なLLMプロバイダー全部からMarkdownを確実に抽出できるのあったら最高だね.DefuddleをシェアされたGeminiのURLで試したんだけど,「Sign In」リンクしか返ってこなかったんだ.もしかしてextractorの使い方間違ってる?レンダリングされた会話HTMLってどうやって手に入れてるの?
たぶん,ほとんどのLLMのAPIはMarkdownを返してて,md→htmlへの変換はその後に行われてるんじゃないかな.だからAPIを直接叩けばMarkdownは「タダで」手に入ると思うよ.
良さそうだね.RSS readerのreadabilityとこれ入れ替えて使ってみるつもり.Pocketなくなるみたいだから,後で読む機能もこれに追加しなきゃかもな….
いいね.あと~3行くらいコード書けば,URLを受け取ってシンプルなHTMLで表示できるようにして,完全な代替になれるんじゃない?
Javascriptで書かれてるから,ブックマークレットとしてパッケージ化できたりしないかな?
obsidian clipperも含めて,ほぼ完璧みたいだね.ありがとう!
Markdownがform要素をサポートしてないって興味深いね.
すごい良い仕事だね.Readabilityの現代的な代替は本当に必要だったんだ.特にLLM向けのきれいなウェブコンテキストを作るのにめちゃくちゃ役立つよ.オープンソースにしてくれてマジありがとう!
LLMってWebページをMarkdownにするのめっちゃ得意だよね 特にClaudeとかGeminiとかさ でもHugging Faceのローカルモデルは全然ダメだったんだよね プロンプト無視したり要約しちゃったりJavaScriptの説明とかしだすし MacBookで動かせるやつ色々試したけど全部ダメだったよ
ちょっと本題から外れるんだけど
Basesのリリースめっちゃ楽しみにしてるんだ
1年くらいロードマップ追いかけてて
ずっと”planned”のところに張り付いてるの見るとガッカリしてたんだよね
まあObsidianとDataviewで
「あとで読む」機能はもう作っちゃったんだけど
これがあると絶対もっと簡単になるよね!
これのことだよ → https://help.obsidian.md/bases
これプレビュー版(Catalyst)使ってるんだけど
もうすぐ正式版が出ると思うよ
そしたらkepanoがここに投稿するんじゃないかな
Readabilityを知らない人のためにリンク貼っとくね → https://github.com/mozilla/readability
面白いね
こういうツールって悪用されるのをどうやって防ぐの?
ユーザー側はどうやって
このツールに悪用されないって信じればいいの?
技術的な話だと
同じページの中にある画像とかのファイルでも
リクエストごとにIP変えてるの?
面白い!
Webサイトに無料プランの制限が書いてないんだけど
教えてもらえない?
無料枠(有料プランなしでAPIキー使う場合ね)は1分間に10リクエストまでって制限があるよ。詳しくはこちら https://pure.md/docs/#section/Rate-limits
気軽に手伝ってね :)
30年オープンソース開発やってる俺の経験から言うけど、”気軽に手伝って”って軽いノリじゃダメだよ。
テストフレームワークを準備して、手伝ってくれる人にはテストも一緒に書いてもらうようにしないと。
ただコード出すだけじゃ誰も手伝わないし、むしろ引かれるんだ。
低評価の人には申し訳ないけど、これはあの軽い返事への大事なフィードバックだよ。
ただ文句言いたいだけで何も役に立つこと言ってないじゃん?
全然言いたいこと分かんないんだけど。
ごめん、言いたいこと伝わってないね。文句じゃなくて、”気軽に手伝って”への長年の経験者からのアドバイスだよ。
俺の6年やってるプロジェクト(500スター、月49kダウンロード)は、ユニットテストがしっかりしてるから信頼されてる。始めた頃は人に頼らず自分で努力したんだ。ツール作るだけじゃなく、基礎作りが重要なんだよ。
知ってたらごめんね。フラグ立ってるみたいだから補足だけど、作者はObsidianのCEOで成功プロジェクトもある人だよ。
だから、自分の500スター自慢とか、”始めた頃は人に頼らず自分でやった”みたいな言い方は、みんなを不快にさせてるんじゃないかな。
もっとコメントを表示(2)
”あのプロジェクトを始めた頃”ってのを明確にしたよ。俺は30年開発やってるし、CEOでもある。
Java@Apacheを立ち上げたりTomcatをオープンソース化したり、成功プロジェクトはたくさんあるんだ。
色々失敗したけど、人への返事で軽く振る舞ったのもその一つ。ただ知見をシェアしたいだけだよ。
君のその後の投稿や編集でトーンが明確になって助かるよ。読者にもそれが伝わるといいね。