Вы можете использовать синтаксический анализатор для рекурсивной навигации по дереву и замены только тегов, которые сделаны из текста.
При этом есть еще несколько вещей, которые вам необходимо учитывать:
- Не весь текст необходимо заменить (например, встроенный JavaScript)
- Некоторые элементы документа могут не нуждаться в разборе (например, заголовки и т. Д.)
Вот быстрый и непроизводственный готовый пример того, как вы могли бы достичь этого:
html = """The HTML you need to parse"""
import BeautifulSoup
IGNORE_TAGS = ['script', 'style']
def parse_content(item, replace_what, replace_with, ignore_tags = IGNORE_TAGS):
for content in item.contents:
if isinstance(content, BeautifulSoup.NavigableString):
content.replaceWith(content.replace(replace_what, replace_with, ignore_tags))
else:
if content.name not in ignore_tags:
parse_content(content, replace_what, replace_with, ignore_tags)
return item
soup = BeautifulSoup.BeautifulSoup(html)
body = soup.html.body
replaced_content = parse_content(body, 'a', 'b')
Это должно заменить любое вхождение "a" на "b", однако оставляя содержимое, которое:
- Внутри встроенного JavaScript или CSS (хотя встроенные JS или CSS не должны появляться в теле документа).
- Ссылка в теге, например, img, a ...
- сам тег
Конечно, вам, в зависимости от вашего глоссария, потребуется убедиться, что вы не заменяете только часть слова чем-то другим; Для этого имеет смысл использовать регулярное выражение для content.replace.