Как удалить пробелы в BeautifulSoup - PullRequest
7 голосов
/ 24 ноября 2010

У меня есть куча HTML-кода, который я анализирую с 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>, поэтому я могу быть немного более энергичным.

Еще раз спасибо!

Ответы [ 3 ]

13 голосов
/ 15 сентября 2013

Старый вопрос, я знаю, но у beautifulsoup4 этот помощник называется stripped_strings.

Попробуйте:

description_el = about.find('p', { "class": "description" })
descriptions = list(description_el.stripped_strings)
description = "\n\n".join(descriptions) if descriptions else ""
11 голосов
/ 24 ноября 2010

Вот как вы можете сделать это без регулярных выражений:

>>> 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 голосов
/ 24 ноября 2010
re.sub(r'[\ \n]{2,}', '', yourstring)

Regex [\ \n]{2} соответствует символам новой строки и пробелам (должен быть экранирован), если их более двух или более. Более тщательная реализация такова:

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

Я бы подумал, что первый заменит только несколько новых строк, но, кажется, (по крайней мере, для меня) он работает просто отлично.

...