python - 通过标签自定义 BeautifulSoup 的 prettify

标签 python html beautifulsoup

我想知道是否有可能使 prettify 不在特定标签上创建新行。

我想让 spana 标签不会分开,例如:

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>

在新行上放置内联样式标签实际上会增加它们之间的空间,稍微改变实际页面的外观。我会将您链接到两个显示差异的 jsfiddles:

anchor tags on new lines

anchor tags next to eachother

如果您想知道为什么这对 BeautifulSoup 很重要,那是因为我正在编写一个网页调试器,并且 prettify 函数将非常有用(以及 bs4 中的其他东西)。但是,如果我美化了文档,那么我就有更改某些内容的风险。

那么,有什么方法可以自定义prettify 函数,以便我可以将其设置为不分解某些标签?

最佳答案

我正在发布一个快速破解,但我没有找到更好的解决方案。

我实际上在我的项目中使用它来避免破坏 textareas 和 pre 标签。将 ['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

关于python - 通过标签自定义 BeautifulSoup 的 prettify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583415/

相关文章:

html - 将 HTML 列表深度重置为根级别(用于元素符号)

python - 使用 python bs4 从 onclick 属性获取值

python - 使用 BeautifulSoup 为每个子页面抓取数据 - url 很长且格式不同

python - 我如何根据 seaborn 的值更改 barplot 中每个条形图的不透明度?

python - 按时间点拆分多个对象的 csv 文件

python - 根据列前缀将DataFrame拆分成多个部分,并对各个部分进行运算

html - 卡片中的 Figcaption 位置 - 如何?

Python 将列表值从索引复制到另一个

html - 自动定位到下拉选择框中的选项

python - 使用 Python 和 Beautiful Soup 解析 HTML