Gefundene Wörter in HTML-Seite highlighten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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:

Code: Alles auswählen

<div class="comment">This is my first comment</div>
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?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Zuletzt geändert von sma am Donnerstag 14. August 2008, 16:55, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Könnte man auch per JavaScript machen, mit jQuery z.b.: http://johannburkard.de/blog/programmin ... lugin.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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!
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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">'
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Versuch mal ``re.DOTALL`` zu setzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten