Seite 1 von 1
Gefundene Wörter in HTML-Seite highlighten
Verfasst: Donnerstag 14. August 2008, 05:30
von Zap
Hallo,
ich habe einen string mit html-Inhalten und möchte diesen so modifizieren das Teilstrings in der Ergebnisseite gehighlightet werden.
Ich kann an der Stelle ja kein einfaches Replace anwenden da nur die
Daten zwischen den Tags modifiziert werden dürfen.
Wenn Beispielsweise der Begriff
comment gesucht wäre und ich hätte folgenden String:
soll das Ergebnis wie folgt aussehen:
Code: Alles auswählen
<div class="comment">This is my first <em>comment</em></div>
Ich möchte mich an der Stelle natürlich nicht auf irgendwelche Tags beschränken und die Modifikation sollte recht zügig sein, da ich sie auf einer Webapplikation zwischenschalten
möchte bevor diese die Suchergebnisse zurück gibt.
Kennt jemandvon euch eine gute Möglichkeit um sowas zu realisieren?
Verfasst: Donnerstag 14. August 2008, 07:39
von sma
Du könntest den Text in Tags und Nicht-Tags aufspalten, z.B. mit dem folgenden regulären Ausdruck, und dann nur Nicht-Tags bearbeiten und am Ende wieder zusammenfügen.
Code: Alles auswählen
tag_re = re.compile(r'<.*?>|[^<]+')
def highlight(source, highlight_search_term):
dest = []
for fragment in (match.group() for match in tag_re.finditer(source)):
dest.append(highlight_search_term(fragment) if fragment[0] != '<' else fragment)
return ''.join(dest)
Alternativ könntet du das HTML mit etwas wie Beautiful Soup parsen.
Stefan
Re: Gefundene Wörter in HTML-Seite highlighten
Verfasst: Donnerstag 14. August 2008, 09:19
von gerold
Zap hat geschrieben:Kennt jemandvon euch eine gute Möglichkeit um sowas zu realisieren?
Hallo Zap!
Du kannst auch den vom Browser vorgesehenen Mechanismus dafür verwenden. Hänge an die URL "?highlight=comment" an.
mfg
Gerold

Verfasst: Donnerstag 14. August 2008, 10:07
von mitsuhiko
Wir machen sowas in Inyoka. Da ich keinerlei Gefahr in dem Code da sehe hab ich den mal in ein Pastebin kopiert:
http://paste.pocoo.org/show/82157
Das ist natürlich ein Beispiel für Django, aber du brauchst das nur aus der Middleware in eine Funktion werfen und das Request/Response Handling rauskicken.
Re: Gefundene Wörter in HTML-Seite highlighten
Verfasst: Donnerstag 14. August 2008, 10:13
von Leonidas
gerold hat geschrieben:Du kannst auch den vom Browser vorgesehenen Mechanismus dafür verwenden. Hänge an die URL "?highlight=comment" an.
Vielleicht habe ich ja etwas in der Browser-Entwicklung verschlafen, aber soweit ich weiß geht Highlight doch nur, sofern die Software die die Seiten generiert das unterstützt, da das Highlighting eben nicht vom Browser, sondern vom Server gemacht wird.
Re: Gefundene Wörter in HTML-Seite highlighten
Verfasst: Donnerstag 14. August 2008, 10:44
von gerold
Leonidas hat geschrieben:soweit ich weiß geht Highlight doch nur, sofern die Software die die Seiten generiert das unterstützt, da das Highlighting eben nicht vom Browser, sondern vom Server gemacht wird.
Hallo Leonidas!
Stimmt! So wie das aussieht, macht das bei mir irgendeines der installierten Browser-Addins. Also kann man meinen Tipp mit "highlight=..." total vergessen.
lg
Gerold

Verfasst: Donnerstag 14. August 2008, 14:59
von jens
Könnte man auch per JavaScript machen, mit jQuery z.b.:
http://johannburkard.de/blog/programmin ... lugin.html
Verfasst: Freitag 15. August 2008, 04:50
von Zap
Danke für die Antworten, jetzt muss ich mich mal zwischen den ganzen Angeboten entscheiden
Die Lösungen mittels re sehen auf jeden Fall schon sehr vielversprechend aus.
Vielen Dank!
Verfasst: Freitag 15. August 2008, 11:01
von Zap
Hallo ich habe ein Problem mit dem re von sma.
Wenn ein Tag einen Zeilenumbruch hat, wird das < Zeichen abgeschnitten.
Weiß jemand da eine Lösung?
Code: Alles auswählen
In [122]: s = """<img src="/images/searchpx.png" \n border="0">"""
In [123]: "".join(re.findall(r'<.*?>|[^<]+', s))
Out[123]: 'img src="/images/searchpx.png" \n border="0">'
# Dieser Versuch geht:
In [124]: s = """<img src="/images/searchpx.png" border="0">"""
In [125]: "".join(re.findall(r'<.*?>|[^<]+', s))
Out[125]: '<img src="/images/searchpx.png" border="0">'
Verfasst: Freitag 15. August 2008, 11:05
von Leonidas
Versuch mal ``re.DOTALL`` zu setzen.