2010-11-24 62 views
6

J'ai un tas de HTML, je suis en train d'analyser avec BeautifulSoup et ça se passe plutôt bien, sauf pour un hic mineur. Je veux enregistrer la sortie dans une chaîne unique doublée, avec comme ma sortie de courant:Comment faire pour supprimer des espaces dans 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> 

Idéalement, je voudrais

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

Il y a beaucoup d'espaces redondants que je serais comme pour se débarrasser de mais il n'est pas nécessairement amovible en utilisant strip(), je ne peux pas supprimer de manière flagrante tous les espaces parce que je dois conserver le texte. Comment puis-je le faire? Cela semble être un problème assez commun que regex serait exagéré, mais est-ce le seul moyen?

Je n'ai pas d'étiquettes <pre> pour que je puisse être un peu plus énergique là-bas.

Merci encore une fois!

+0

Comment allez-vous l'impression de votre sortie? – user225312

+0

Vous pouvez faire ce que les navigateurs font: Réduire tous les espaces adjacents (dans le texte) en espaces simples. – delnan

Répondre

9

Voici comment vous pouvez le faire sans expressions régulières:

>>> 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} correspond à des espaces et des sauts de ligne (doit être échappé) quand il y a plus de deux ou plusieurs d'entre eux. La mise en œuvre plus complète est la suivante:

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

Je pense que la première ne ferait que remplacer plusieurs nouvelles lignes, mais il semble (au moins pour moi) de travailler très bien.

6

question ancienne, je sais, mais beautifulsoup4 a cette aide appelée stripped_strings.

Essayez ceci:

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