2010-11-24 3 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) 

Regex [\ \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 "" 
Смежные вопросы