14

Arc90 の readability.js にほぼ相当する Python のパッケージ/モジュール/関数などを探しています

http://lab.arc90.com/experiments/readability

http://lab.arc90.com/experiments/readability/js/readability.js

input.html を与えると、結果はその html ページの「メインテキスト」のクリーンアップされたバージョンになります。サーバー側で使用できるようにこれが必要です (ブラウザー側でのみ実行される JS バージョンとは異なります)。

何か案は?

PS:Rhino + env.jsを試してみましたが、その組み合わせは機能しますが、パフォーマンスは受け入れられず、ほとんどのhtmlコンテンツをクリーンアップするのに数分かかります:((なぜこのような大きなパフォーマンスの違いがあるのか​​ まだわかりませんでした)。

4

6 に答える 6

11

私のフォークhttps://github.com/buriy/python-readabilityを試してみてください。これは高速で、最新の JavaScript バージョンのすべての機能を備えています。

于 2011-06-16T15:34:21.517 に答える
4

repustate.com で新しい自然言語処理 API をローンチしました。REST API を使用すると、HTML または PDF をクリーンアップして、テキスト部分だけを取り戻すことができます。APIは無料ですので、思う存分ご利用ください。そしてそれはpythonで実装されています。それをチェックして、結果を readability.js と比較してください。ほぼ 100% 同じであることがわかると思います。

于 2010-05-31T19:47:57.543 に答える
3

Readability のブログ経由のhn.pyApp Engine アプリであるReadable Feedsはこれを利用しています。

ここに pip インストール可能なモジュールとしてバンドルしました: http://github.com/srid/readability

于 2010-09-07T01:11:09.840 に答える
1

私は過去にこれについていくつかの調査を行い、最終的にこのアプローチ [pdf]を Python で実装しました。私が実装した最終バージョンでは、アルゴリズムを適用する前に、head/script/iframe 要素、隠し要素などを削除するなどのクリーンアップも行いましたが、これが核心でした。

これは、「リンクリスト」ディスクリミネーターの (非常に) 単純な実装を備えた関数です。これは、リンクとテキストの比率が高い要素 (つまり、ナビゲーションバー、メニュー、広告など) を削除しようとします。

def link_list_discriminator(html, min_links=2, ratio=0.5):
    """Remove blocks with a high link to text ratio.

    These are typically navigation elements.

    Based on an algorithm described in:
        http://www.psl.cs.columbia.edu/crunch/WWWJ.pdf

    :param html: ElementTree object.
    :param min_links: Minimum number of links inside an element
                      before considering a block for deletion.
    :param ratio: Ratio of link text to all text before an element is considered
                  for deletion.
    """
    def collapse(strings):
        return u''.join(filter(None, (text.strip() for text in strings)))

    # FIXME: This doesn't account for top-level text...
    for el in html.xpath('//*'):
        anchor_text = el.xpath('.//a//text()')
        anchor_count = len(anchor_text)
        anchor_text = collapse(anchor_text)
        text = collapse(el.xpath('.//text()'))
        anchors = float(len(anchor_text))
        all = float(len(text))
        if anchor_count > min_links and all and anchors / all > ratio:
            el.drop_tree()

私が使用したテスト コーパスでは、実際には非常にうまく機能しましたが、高い信頼性を実現するには、多くの微調整が必​​要です。

于 2010-05-29T07:20:03.917 に答える
0

Rhino の代わりに Google V8/Node.js を使ってみませんか? 許容できる速さである必要があります。

于 2010-05-27T13:51:31.413 に答える
-3

BeautifulSoupは python 用の最高の HTML パーサーだと思います。ただし、サイトの「メイン」部分が何であるかを把握する必要があります。

1 つのドメインのみを解析する場合は、かなり簡単ですが、どのサイトでも機能するパターンを見つけるのはそれほど簡単ではありません。

おそらく、readability.js アプローチを Python に移植できますか?

于 2010-05-28T14:00:07.553 に答える