Выравнивание между HTML и его текстом

Я очищаю содержимое HTML с помощью BeautifulSoup и хотел бы иметь возможность перемещаться между фактическим HTML и его атрибутом getText ().

>>> html = "<p>Test</p>"

Загрузите это в BeautifulSoup

>>> soup = BeautifulSoup(html, 'html.parser')

Теперь я легко могу получить его текстовую версию без атрибутов html:

>>> text = soup.get_text()
>>> print(text)
"Test"

Есть ли способ обеспечить сопоставление (выравнивание) между индексами каждого символа между html и text? Мне нужно выполнить обработку на text, но затем изменить содержимое в html.

Здесь это означало бы:

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
< | p | > | T | e | s | t | < | / | p | >

&

0 | 1 | 2 | 3
T | e | s | t

Таким образом, выравнивание будет [(3,0), (4,1), (5,2), (6,3)].

Конечно, пример прост, но он мне понадобится для очень сложных и больших файлов HTML. Это кому-то звонит в колокольчик?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
34
1

Ответы 1

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

Проблема, похоже, заключается в определении смещения между фактическим исходным кодом html и содержащимся в нем текстом (с учетом смещения символа исходного кода, введенного тегом до и после). Я сам не использую эту библиотеку, но вот она.

Проблема, похоже, полностью решается с помощью модуля Python re. Я знаю, что у суп есть некоторые подсказки об их собственном использовании поиска строк re, но они не очень подробны, поэтому я буду обсуждать библиотеку python re вместо этого, поскольку она кажется похожей:

это разрешение предполагает и зависит от предпосылки, что содержащийся текст в теге в исходном коде уникален.

Программно создайте такое регулярное выражение: "<TAGNAME [\w ]*> (STRING CONTENTS)<TAGNAME/>". Это регулярное выражение использует группы, так что с помощью match.group(0).start() вы можете получить начальную позицию всего тега в исходном коде, а с помощью match.group(1).start() вы получите позицию STRING CONTENTS. Обнаружив разницу между этими двумя позициями, вы сможете сгенерировать сохраняемое целое число смещения, которое вы можете просто использовать вместо создания сопоставления словаря (тем не менее смещение можно использовать для создания словаря).

N.B: Имея ссылку на этот ответ, я узнал, что суп (the output of beautifulsoup(html, 'html.parser')) изменяет структуру входной строки, поэтому его будет ненадежно использовать по сравнению с исходным кодом нетронутого строкового литерала.

Другие вопросы по теме