Мне нужно подсвечивать заданные слова в html-документе. Я пытаюсь сделать это с помощью BeautifulSoupe и Regexp. Но если просто менять слова и строить новый документ, то в результате он может оказаться "сломанным", т.е. например появляются куски javascript-кода.
import urllib2
import re
from bs4 import BeautifulSoup
html = urllib2.urlopen('https://support.google.com/finance/?hl=en&ei=VC8QVaH0N-acwgP36IG4AQ').read()
soup = BeautifulSoup(html, 'html5lib')
for text in soup.body.findAll(text=True):
if re.search(r'inance\b',text):
new_html = "<p>"+re.sub(r'(\w*)inance\b', r'<span style="background-color:#FF00FF">\1inance</span>', text)+"</p>"
new_soup = BeautifulSoup(new_html)
text.parent.replace_with(new_soup.p)
print soup
Другой вариант, это обрамлять теги в BeautifulSoupe
matches = soup.body.findAll(text=re.compile(r"\bFinance\b", re.UNICODE))
for match in matches:
match.wrap(soup.new_tag('span', style="background-color:#FE00FE"))
match.wrap(soup.new_tag('b'))
В этом случае документ не сломается, но так можно подсвечивать только найденный тег целиком (т.е. целые заголовки или предложения).
Как это можно сделать? Вроде-бы задача типовая (подсветка ключевых слов при поиске документа).