2010-11-24 124 views
6

我有一堆HTML我正在用BeautifulSoup解析,除了一个小小的障碍外,它一直很好。我想保存输出到一个单一的内衬字符串,以下为我的电流输出:如何删除BeautifulSoup中的空格

<li><span class="plaincharacterwrap break"> 
        Zazzafooky but one two three! 
       </span></li> 
<li><span class="plaincharacterwrap break"> 
        Zazzafooky2 
       </span></li> 
<li><span class="plaincharacterwrap break"> 
        Zazzafooky3 
       </span></li> 

理想我想

<li><span class="plaincharacterwrap break">Zazzafooky but one two three!</span></li><li><span class="plaincharacterwrap break">Zazzafooky2</span></li> 

有很多冗余的空白,我会喜欢摆脱,但它不一定使用strip()可移动,我也不能公然删除所有的空间,因为我需要保留文本。我该怎么做?这似乎是一个常见的问题,正则表达式会过度杀伤,但这是唯一的方法吗?

我没有任何<pre>标签,所以我可以在那里更强大一点。

再次感谢!

+0

你是如何打印您的输出? – user225312 2010-11-24 19:38:10

回答

9

这里是你如何能做到这没有正则表达式:

>>> html = """ <li><span class="plaincharacterwrap break"> 
...      Zazzafooky but one two three! 
...     </span></li> 
... <li><span class="plaincharacterwrap break"> 
...      Zazzafooky2 
...     </span></li> 
... <li><span class="plaincharacterwrap break"> 
...      Zazzafooky3 
...     </span></li> 
... """ 
>>> html = "".join(line.strip() for line in html.split("\n")) 
>>> html 
'<li><span class="plaincharacterwrap break">Zazzafooky but one two three!</span></li><li><span class="plaincharacterwrap break">Zazzafooky2</span></li><li><span class="plaincharacterwrap break">Zazzafooky3</span></li>' 
0
re.sub(r'[\ \n]{2,}', '', yourstring) 

正则表达式匹配[\ \n]{2}换行符和空格(已经被转义),当有两个以上或更多的人。更彻底的实现是这样的:

re.sub('\ {2,}', '', yourstring) 
re.sub('\n*', '', yourstring) 

我想第一个只会取代多个换行符,但似乎(至少对我来说)工作得很好。

6

老问题,我知道,但是beautifulsoup4有这个帮手叫stripped_strings。

试试这个:

description_el = about.find('p', { "class": "description" }) 
descriptions = list(description_el.stripped_strings) 
description = "\n\n".join(descriptions) if descriptions else ""