2016-03-05 40 views
2

美麗的湯塗抹出HTML,以便每個元素開始一個新行。中等縮小HTML(來自美麗湯的輸出)

我發現所有的HTML縮小器都壓縮一切到一行。

是否有,在某處(最好是在Python中)一個將輸出正常HTML的工具。那就是:塊元素會得到一個新行,但內聯元素不會?

BS輸出

<h2> 
headline 
</h2> 
<p> 
    Blah blah 
    <b> 
    bold text 
    </b> 
    same paragraph blah 
    <a href=""> 
    a link in the text 
    </a> 
</p> 
<p> 
Another paragraph 
</p> 

精縮

<h2>headline</h2><p> Blah blah <b> bold text </b> same paragraph blah <a href=""> a link in the text </a></p><p> Another paragraph</p> 

我想要什麼

<h2>headline</h2> 
<p> Blah blah <b> bold text </b> same paragraph blah <a href=""> a link in the text </a></p> 
<p> Another paragraph</p> 

回答

1

這裏有一個快速和雙rty解決方案。

製作每個塊級元素的開始標籤的正則表達式。在BeautifulSoup樹上使用str(),然後使用re.sub()在塊級元素前插入\ n。

import re 

blocktags = '''\ 
<address <article <aside 
<blockquote 
<canvas 
<dd <div <dl 
<fieldset <figcaption <figure <footer <form 
<h1 <h2 <h3 <h4 <h5 <h6 <header <hgroup <hr 
<li 
<main 
<nav <noscript 
<ol <output 
<p <pre 
<section 
<table <tfoot 
<ul 
<video'''.split() 

pat = re.compile('(' + '|'.join(blocktags) + ')') 

blocked_str = pat.sub(r'\n\1', str(soup)) 
+0

所以我結合htmlmin(https://pypi.python.org/pypi/htmlmin/),而不是BS4的STR()解決方案。 (因爲字符編碼和其他一些事情,我需要BS4的正常輸出。)Works。 –

+0

邪惡的領主在你身後https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –