Удалите все встроенные стили с помощью BeautifulSoup

Я делаю некоторую очистку HTML с помощью BeautifulSoup. Noob для Python и BeautifulSoup. У меня есть теги, удаляемые правильно следующим образом, на основе ответа, который я нашел в другом месте на Stackoverflow:

[s.extract() for s in soup('script')]

но как удалить встроенные стили? Например:

<p class="author" id="author_id" name="author_name" style="color:red;">Text</p>
<img class="some_image" href="somewhere.com">

должны стать:

<p>Text</p>
<img href="somewhere.com">

как удалить встроенные атрибуты класса, id, name & style всех элементов?

ответы на другие подобные вопросы я могу найти все упомянутые с помощью парсера CSS для обработки этого, а не BeautifulSoup, но поскольку задача состоит в том, чтобы просто удалить, а не манипулировать атрибутами, и является общим правилом для всех тегов, я надеялся найти способ сделать все это в BeautifulSoup.

4 ответов


вам не нужно анализировать любые CSS, если вы просто хотите удалить все. BeautifulSoup предоставляет способ удалить все атрибуты, такие как:

for tag in soup():
    for attribute in ["class", "id", "name", "style"]:
        del tag[attribute]

кроме того, если вы просто хотите удалить все теги (и их содержимое), вам не нужно extract(), который возвращает тег. Вам просто нужно decompose():

[tag.decompose() for tag in soup("script")]

не большая разница, но кое-что я нашел, глядя на документы. Вы можете найти более подробную информацию об API в BeautifulSoup документация, С множеством примеров.


Я бы не сделал этого в BeautifulSoup - вы потратите много времени на попытки, тестирование и работу с краевыми случаями.

Bleach делает именно это для вас. http://pypi.python.org/pypi/bleach

если вы должны были сделать это в BeautifulSoup, Я бы предложил вам пойти с подходом "белого списка", например Bleach делает. Решите, какие теги могут иметь какие атрибуты, и удалите все теги / атрибуты, которые не совпадают.


основываясь на функции jmk, я использую эту функцию для удаления базы атрибутов в белом списке:

работа в python2, BeautifulSoup3

def clean(tag,whitelist=[]):
    tag.attrs = None
    for e in tag.findAll(True):
        for attribute in e.attrs:
            if attribute[0] not in whitelist:
                del e[attribute[0]]
        #e.attrs = None     #delte all attributes
    return tag

#example to keep only title and href
clean(soup,["title","href"])

вот мое решение для Python3 и BeautifulSoup4:

def remove_attrs(soup, whitelist=tuple()):
    for tag in soup.findAll(True):
        for attr in [attr for attr in tag.attrs if attr not in whitelist]:
            del tag[attr]
    return soup

Он поддерживает белый список атрибутов, которые должны быть сохранены. :) Если белый список не указан, все атрибуты удаляются.