@Evgeny_A

Как удалить дубли тэгов из HTML строки?

Здравствуйте.

Я анализирую контент страницы спарсенной с помощью Python 3 и Beautiful Soup. Проблема в том, что на странице могут быть дубли HTML тэгов которые расположены в разных ветках DOM (заранее мне их положение не известно). Дубли тэгов нужно удалить (но оригинал тэга оставить), чтобы потом из HTML извлечь текст внутри тэгов. Например вот такое может быть внутри объекта soup:

<div class="act_first">
  <div class="stats">

    <div class="key">COLOR</div>
    <div class="value">Brown</div>

  </div>
</div>

<div id="stats" class="not_visible">
  <div class="stats">
    
    <div class="key">COLOR</div>
    <div class="value">Brown</div>
    
  </div>
</div>


Нужно удалить это:

<div class="stats">

    <div class="key">COLOR</div>
    <div class="value">Brown</div>

  </div>


Чтобы осталось это:

<div class="act_first">
  <div class="stats">

    <div class="key">COLOR</div>
    <div class="value">Brown</div>

  </div>
</div>

<div id="stats" class="not_visible">

</div>


Я накидал код с подробными комментариями:

# Получаем список всех тэгов со страницы
			all_tags = soup.find_all()

			# Список из тэгов после чистки
			all_tags_list = []

			# Конвертируем список тэгов в список
			for tag in all_tags:

				all_tags_list.append(str(tag))

			print('Всего тэгов на странице', len(all_tags_list))

			tags_before_clear = all_tags_list

			# Удаляем дубли тэгов, сравнивая каждый с каждым
			for tag in all_tags_list:

				for tag_1 in all_tags_list:

					# Если тэги совпадают, удаляем второй тэг
					if tag == tag_1:

						tags_before_clear.remove(tag)

			print('Тэгов после чистки', len(tags_before_clear))

			# Склеиваем список в строку
			tags_before_clear_str = ' '.join(tags_before_clear)

			# Снова создаем объект SOUP
			soup = BeautifulSoup(tags_before_clear_str, 'html5lib')

			# Извлекаем только текст из тэгов и переводим в нижний регистр
			soup_text = soup.text.lower()


Мне не хватает понимания каким должен быть цикл, чтобы в итоге у меня остался список с уникальными тегами порядок которых не нарушен.
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Andrey_Dolg
Используйте css селекторы или xpath. Из вашего примера:
soup.select("div.act_first")
Как результат:
<div class="act_first">
  <div class="stats">

    <div class="key">COLOR</div>
    <div class="value">Brown</div>

  </div>
</div>

BeautifulSoup создан для того чтобы вы не работали со страницей как с текстом.
(заранее мне их положение не известно).

Сомнительно что нельзя выбрать что-то одно используя класс.
Так же если вы хотите избежать дублей используйте множества.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы