2010-11-24 14 views
6

Ich habe eine Reihe von HTML Ich analysiere mit BeautifulSoup und es läuft ziemlich gut, außer für einen kleinen Haken. Ich mag die Ausgabe in eine einzeilige Zeichenfolge, mit dem folgenden als meine aktuellen Ausgabe speichern:So entfernen Sie Whitespace in 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> 

Im Idealfall würde ich

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

wie viele redundanten Leerzeichen Es ist das würde ich mag es loszuwerden, aber es ist nicht unbedingt entfernbar mit strip(), noch kann ich offensichtlich alle Leerzeichen entfernen, weil ich den Text behalten muss. Wie kann ich es tun? Es scheint ein allgemein genug Problem, dass Regex Overkill wäre, aber ist das der einzige Weg?

Ich habe keine <pre> Tags, so dass ich ein wenig stärker dort sein kann.

Danke noch einmal!

+0

Wie werden Sie Ihren Ausgangsdruck? – user225312

+0

Sie können tun, was Browser tun: Reduzieren Sie alle benachbarten Leerzeichen (im Text) in einzelne Leerzeichen. – delnan

Antwort

9

Hier ist, wie man es ohne reguläre Ausdrücke tun können:

>>> 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) 

Regex [\ \n]{2} Spiele Zeilenumbrüche und Leerzeichen (entgangen sein), wenn es mehr als zwei ist oder mehr von ihnen. Die gründlichere Umsetzung ist dies:

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

ich die erste denken würde, würde nur mehrere Zeilenumbrüche ersetzen, aber es scheint (zumindest für mich) ganz gut zu arbeiten.

6

Alte Frage, ich weiß, aber beautifulsoup4 hat diese Helfer stripped_strings genannt.

Try this:

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