@chrispsow

Как извлечь текст из тега и потом заменить его с помощью Soup Python?

Есть такой кусочек HTML кода:

<div class="f-subheader subheader f-subheader-sm" data-editable="true" data-main-class="subheader" data-param="subheader">
            <p>
             holding educativo internacional
            </p>
            <p>
             Academia STANDART LONDRES
            </p>
           </div>
           <div class="f-header header f-header-72" data-editable="true" data-main-class="header" data-param="header">
            <p>
             <br/>
            </p>
            <p>
             <br/>
            </p>
            <p>
             <br/>
            </p>
            <h1>
             Модные курсы и семинары
             <br/>
             парикмахеров, стилистов, визажистов, косметологов И мастеров маникюра
            </h1>
           </div>
           <div class="f-desc description f-desc-xl" data-editable="true" data-main-class="description" data-param="description">
            <p>
             <strong>
              ЕВРОПЕЙСКИЙ СТАНДАРТ ОБУЧЕНИЯ В Мексике и Колумбии
              <br/>
              ОТ ЭКСПЕРТОВ КРАСОТЫ ИЗ ЛОНДОНА
             </strong>
             <br/>
            </p>
           </div>
           <div class="buttons" data-main-class="buttons">
            <button class="btn f-btn btn-success" id="button3504888" style="color: #FFFFFF; background-color: #E31e24; " type="button">
             Ver todos los cursos
            </button>


Тот текст, что не на русском - был успешно извлечен, переведен и вставлен обратно
А тот, что не переведен - не был найден и соответсвенно не обработан.

Python скрипт:

soup = Soup(html, features="html.parser")
tags = ['span', 'p', 'b', 'a', 'div', 'li', 'h1', 'h2', 'h3', 'button', 'small', 'strong', 'td', 'img', 'input']

for tag in tags:
	for htmltag in soup.find_all(tag):
		try:
			# print(f'Text: {htmltag.text}, string: {htmltag.string}')
			if htmltag.string and len(htmltag.string) > 0:
				# if tag == 'span' and 'Copyright' in htmltag.string : continue
				# print(f'Tag <{tag}> String: {htmltag.string}')
				translated = translator.translate(htmltag.string, dest=lang)
				print(f'<{tag}> {htmltag.string} > {translated.text}')
				htmltag.string.replace_with(translated.text)
			elif tag == 'img' and 'alt' in htmltag.attrs and len(htmltag["alt"]) > 0:
				# print(f'Tag <{tag}> Alt: {htmltag["alt"]}')
				translated = translator.translate(htmltag['alt'], dest=lang)
				print(f'<{tag}> {htmltag["alt"]} > {translated.text}')
				htmltag['alt'] = translated.text
			elif tag == 'input' and 'placeholder' in htmltag.attrs and len(htmltag["placeholder"]):
				# print(f'Tag <{tag}> Placeholder: {htmltag["placeholder"]}')
				translated = translator.translate(htmltag['placeholder'], dest=lang)
				print(f'<{tag}> {htmltag["placeholder"]} > {translated.text}')
				htmltag['placeholder'] = translated.text
		except Exception as e:
			pass
			print(f'*** ERROR Tag: {tag} , htmltag: {htmltag} , Str: {htmltag.string} / Err: {e} ***')
			errors += 1


Через htmtagl.text он находит текст, но и так же находит и код тега < script > если он в блоке < div >, чего не делает метод htmltag.string
А через .string он, как я понял, не находит текст, который включает в себя < /br > или еще что-то
Как извлекать текст и заменять его потом во всех тегах, в которых он есть?
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы