Использование модуля Beautiful Soup Python для замены тегов простым текстом

Я используюКрасивый суп извлечь «контент» из веб-страниц. Я знаю, что некоторые люди спрашивали этовопрос раньше и все они указывали на Beautiful Soup, и именно так я начал с этого.

Мне удалось успешно получить большую часть контента, но я столкнулся с некоторыми проблемами с тегами, которые являются частью контента. (Я начинаю с базовой стратегии: если в узле больше x-символов, то это контент). Давайте возьмем приведенный ниже HTML-код в качестве примера:

<div id="abc">
    some long text goes <a href="/"> here </a> and hopefully it 
    will get picked up by the parser as content
</div>

results = soup.findAll(text=lambda(x): len(x) > 20)

Когда я использую приведенный выше код для получения длинного текста, он разрывается (идентифицированный текст начинается с «и, надеюсь, ...») на тегах. Поэтому я попытался заменить тег обычным текстом следующим образом:

anchors = soup.findAll('a')

for a in anchors:
  a.replaceWith('plain text')

Выше не работает, потому что Beautiful Soup вставляет строку как NavigableString, и это вызывает ту же проблему, когда я использую findAll с len (x)> 20. Я могу использовать регулярные выражения, чтобы сначала проанализировать HTML как простой текст, очистить все нежелательные теги, а затем вызвать Beautiful Soup. Но я хотел бы не обрабатывать один и тот же контент дважды - я пытаюсь разобрать эти страницы, чтобы показать фрагмент контента по заданной ссылке (очень похоже на общий доступ к Facebook) - и, если все сделано с Beautiful Soup, Я предполагаю, что это будет быстрее.

Поэтому мой вопрос: есть ли способ «очистить теги» и заменить их «простым текстом» с помощью Beautiful Soup. Если нет, что будет лучшим способом сделать это?

Спасибо за ваши предложения!

Обновить: Код Алекса работал очень хорошо для примера. Я также пробовал различные крайние случаи, и они все работали хорошо (с модификацией ниже). Поэтому я попробовал сделать это на реальном веб-сайте и столкнулся с проблемами, которые меня озадачили.

import urllib
from BeautifulSoup import BeautifulSoup

page = urllib.urlopen('http://www.engadget.com/2010/01/12/kingston-ssdnow-v-dips-to-30gb-size-lower-price/')

anchors = soup.findAll('a')
i = 0
for a in anchors:
    print str(i) + ":" + str(a)
    for a in anchors:
        if (a.string is None): a.string = ''
        if (a.previousSibling is None and a.nextSibling is None):
            a.previousSibling = a.string
        elif (a.previousSibling is None and a.nextSibling is not None):
            a.nextSibling.replaceWith(a.string + a.nextSibling)
        elif (a.previousSibling is not None and a.nextSibling is None):
            a.previousSibling.replaceWith(a.previousSibling + a.string)
        else:
            a.previousSibling.replaceWith(a.previousSibling + a.string + a.nextSibling)
            a.nextSibling.extract()
    i = i+1

Когда я запускаю приведенный выше код, я получаю следующую ошибку:

0:<a href="http://www.switched.com/category/ces-2010">Stay up to date with 
Switched's CES 2010 coverage</a>
Traceback (most recent call last):
  File "parselink.py", line 44, in <module>
  a.previousSibling.replaceWith(a.previousSibling + a.string + a.nextSibling)
 TypeError: unsupported operand type(s) for +: 'Tag' and 'NavigableString'

Когда я смотрю на код HTML, у «Будьте в курсе ...» нет предыдущего брата (я не знал, как работал предыдущий брат, пока не увидел код Алекса и, основываясь на моем тестировании, похоже, что он ищет «текст»). перед тегом). Итак, если нет предыдущего родного брата, я удивляюсь, что он не проходит через логику if a.previousSibling - None, а a; nextSibling - None.

Не могли бы вы дать мне знать, что я делаю не так?

-ecognium

Ответы на вопрос(2)

Ваш ответ на вопрос