Gefundene Wörter in HTML-Seite highlighten

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

Gefundene Wörter in HTML-Seite highlighten

Beitragvon Zap » Donnerstag 14. August 2008, 05:30

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=]<div class="comment">This is my first comment</div>[/code]
soll das Ergebnis wie folgt aussehen:
[code=]<div class="comment">This is my first <em>comment</em></div>[/code]

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

Beitragvon sma » Donnerstag 14. August 2008, 07:39

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Gefundene Wörter in HTML-Seite highlighten

Beitragvon gerold » Donnerstag 14. August 2008, 09:19

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.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Donnerstag 14. August 2008, 10:07

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Gefundene Wörter in HTML-Seite highlighten

Beitragvon Leonidas » Donnerstag 14. August 2008, 10:13

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 Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Gefundene Wörter in HTML-Seite highlighten

Beitragvon gerold » Donnerstag 14. August 2008, 10:44

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 14. August 2008, 14:59

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Freitag 15. August 2008, 04:50

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

Beitragvon Zap » Freitag 15. August 2008, 11:01

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">'
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 15. August 2008, 11:05

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder