Как с помощью python подсветить слова в документе не ломая DOM?

Мне нужно подсвечивать заданные слова в 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'))


В этом случае документ не сломается, но так можно подсвечивать только найденный тег целиком (т.е. целые заголовки или предложения).

Как это можно сделать? Вроде-бы задача типовая (подсветка ключевых слов при поиске документа).
  • Вопрос задан
  • 581 просмотр
Пригласить эксперта
Ответы на вопрос 1
@throughtheether
human after all
Навскидку, делал бы так:
1) нашел бы интересующий элемент (текстовую ноду)
2) обратился бы к его родителю (непосредственному предку)
3) интересующий элемент разделил бы на три: до ключевого слова, ключевое слово и после него.
4) запомнил бы индекс элемента из п. 1) среди потомков родителя из п. 2), удалил его, на его место вставил три потомка из п. 3), при чем средний из них должен быть обернут в span с нужным форматированием.
UPD:
не python, но посмотрите на этот проект.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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