12

prettify特定のタグに新しい行を作成しないようにすることが可能かどうか疑問に思っていました。

タグが分割されないようにしたいと思います。たとえば、次のようにspanなります。a

doc="""<div><div><span>a</span><span>b</span>
<a>link</a></div><a>link1</a><a>link2</a></div>"""

from bs4 import BeautifulSoup as BS
soup = BS(doc)
print soup.prettify()

以下は私が印刷したいものです:

<div>
    <div>
        <span>a</span><span>b</span>
        <a>link</a>
    </div>
    <a>link1</a><a>link2</a>
</div>

しかし、これは実際に印刷されるものです:

<div>
    <div>
        <span>
            a
        </span>
        <span>
            b
        </span>
        <a>
            link
        </a>
    </div>
    <a>
        link1
    </a>
    <a>
        link2
    </a>
</div>

このように新しい行にインライン スタイルのタグを配置すると、実際にはそれらの間にスペースが追加され、実際のページの外観がわずかに変わります。違いを表示する 2 つの jsfiddles にリンクします。

新しい行のアンカー タグ

隣同士のアンカータグ

なぜそれが BeautifulSoup にとって重要なのか疑問に思っているなら、それは私が Web ページのデバッガーを書いているからであり、prettify 関数は (bs4 の他のものと同様に) 非常に便利です。しかし、文書をきれいにすると、いくつかの変更を加える危険があります。

prettifyそれで、特定のタグを分割しないように設定できるように関数をカスタマイズする方法はありますか?

4

2 に答える 2

14

より良い解決策が見つからない間、簡単なハックを投稿しています。

私は実際にプロジェクトでそれを使用して、テキストエリアと事前タグを壊さないようにしています。['span', 'a'] を、インデントを防止したいタグに置き換えます。

markup = """<div><div><span>a</span><span>b</span>
<a>link</a></div><a>link1</a><a>link2</a></div>"""

# Double curly brackets to avoid problems with .format()
stripped_markup = markup.replace('{','{{').replace('}','}}')

stripped_markup = BeautifulSoup(stripped_markup)

unformatted_tag_list = []

for i, tag in enumerate(stripped_markup.find_all(['span', 'a'])):
    unformatted_tag_list.append(str(tag))
    tag.replace_with('{' + 'unformatted_tag_list[{0}]'.format(i) + '}')

pretty_markup = stripped_markup.prettify().format(unformatted_tag_list=unformatted_tag_list)

print pretty_markup
于 2013-08-25T12:12:17.420 に答える