9

target="_blank"最近、次のような外部リンクへの追加を実装しました。

@hooks.register('after_edit_page')
def do_after_page_edit(request, page):
    if hasattr(page, "body"):
        soup = BeautifulSoup(page.body)
        for a in soup.findAll('a'):
            if hasattr(a, "href"):
            a["target"] = "_blank"
        page.body = str(soup)
        page.body = page.body.replace("<html><head></head><body>", "")
        page.body = page.body.replace("</body></html>", "")
        page.body = page.body.replace("></embed>", "/>")
        page.save()

@hooks.register('construct_whitelister_element_rules')
def whitelister_element_rules():
    return {
        'a': attribute_rule({'href': check_url, 'target': True}),
    }

問題:

  1. 美しいスープが出力を混乱させ、html, head & bodyタグを追加する - html、head、body タグを自動的に付けないでください、beautifulsoup

  2. また、埋め込みタグを台無しにします-BeautifulSoup 4に自己終了タグを尊重させる方法は?

  3. fixしたがって、出力の一部を空白の文字列に手動で置き換える、くだらない " "。

質問:

これを行うための正しくて最良の方法は何ですか?

4

2 に答える 2

9

同じ問題に苦しんでいて、wagtailhooks を使用してそれを達成できませんでした。私の最初の解決策は、フィルターを使用して base.html のコンテンツを操作することでした。コードの一部を切り取るフィルタは、コンテンツ ブロックに配置すると完全に機能します。例:

{{ self.body|cut: ‘ href="http:’}}

上記のフィルターはコンテンツの一部を削除しますが、残念ながら「置換」はフィルターとして使用できません (私は Python 3.x を使用しています)。そのため、私の次のアプローチは、custom_filter を作成してフィルター オプションとして「replace」を作成することでした。簡単に言えば、コンテンツが元の「StreamValue」データ型から「文字列」に変換された場合にのみ、部分的に機能しました。この変換により、すべての html タグが表示されたコンテンツが生成されたため、置き換えによって html が機能しませんでした。コンテンツを再び StreamValue に戻すことができず、他の Python データ型で問題を解決することはできませんでした。最終的に、JQuery は私のために仕事をしてくれました:

$(document).ready(function(){
$('a[href^="http://"]').attr('target', '_blank');
});        

このコードは、「http://」を含む各リンクに「target="_blank"」を追加するため、すべての内部リンクは既存のタブにとどまります。base.html (または同様のもの) の最後に配置する必要があり、もちろん、実行する前に JQuery をロードする必要があります。hereから答えを得ました。JQuery がそれを行うための正しい方法であるかどうかはわかりませんが、最小限のコーディングで私にとって魅力的に機能します。

于 2015-12-14T15:34:40.887 に答える