我想知道是否有可能使 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>
在新行上放置内联样式标签实际上会增加它们之间的空间,稍微改变实际页面的外观。我会将您链接到两个显示差异的 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/