Удалите все встроенные стили с помощью 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
Он поддерживает белый список атрибутов, которые должны быть сохранены. :) Если белый список не указан, все атрибуты удаляются.