Seite 1 von 1
string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 11:37
von TheBarty
Hallo zusammen,
ich bin ein ziemlicher Python newbie und bekomme es nicht hin.
Wie bekomme ich nur '<link/>' aus dem String hier gelöscht?
Code: Alles auswählen
a_string = '<link/>' #dieses Tag soll entfernt werden
new_string = a_string.replace('<link/>', '') # leider greift die replace Funktion hier NICHT
Hat jemand einen Tip für mich?
Viele Grüße
Stephan
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 11:58
von darktrym
Bei mir schon.
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 11:58
von Sirius3
@TheBarty: neben der Tatsache, dass man XML-Daten nicht mit Stringoperationen bearbeiten sollte, was sind Deine wirklichen Inputdaten und was erwartest Du als Output?
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 13:53
von TheBarty
Hi ihr beiden,
vielen lieben Dank für Euer fixes Feedback.
Den Fehler habe ich gefunden.
Der korrekte Output wurde nochmal durch beautiful-soup gejagt und die Suppe hat die Tags wieder zurück gezaubert...
Alles ein wenig verwirrend....
Fazit für alle Leser dieses Threads:
string.replace funktioniert natürlich KORREKT!
Vielen Dank und viele Grüße
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 14:06
von Sirius3
@TheBarty: nochmals, hier mit Stringmanipulation herumzumurksen ist grob fahrlässig. Wenn Du schon den geparsten HTML-Baum hast, ist es doch kein Problem darin die Link-Zeige herauszulöschen.
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 14:08
von BlackJack
@TheBarty: Ergänzend zu Sirius3: Wieso sollte BeautifulSoup *leere* <link>-Elemente einfügen? Glaube ich irgendwie nicht, kann ich hier auch nicht nachvollziehen.
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 17:27
von TheBarty
@BlackJack: Ich weiß und ich fühle mich auch total schlecht dabei!!
Ok Jungs, ich geb Euch noch mehr Infos:
An das Problem hier habe ich einige Stunden vergeudet. Alles was ich wollte, war in einer Datei das H1 Tag durch einen anderen (html formatierten) Text zu ersetzen:
Code: Alles auswählen
found_tag = soup.find (attrs={'id':'h1'})
# DER RICHTIGE WEG, allerdings mit Fehler bei Ausgabe: String wird von Beautiful Soup escaped!
new_tag = soup.new_tag('h1', id='h1')
new_tag.string = 'Neuer H1 Content mit <b>Html Tags</b>'
found_tag.replace_with( new_tag ) # Klappt, aber String wird ecaped!
# DER SCHMUTZIGE WEG, der funktioniert
the_tag = '<h1 id="h1">Neuer H1 Content mit <b>Html Tags</b></h1>'
found_tag.replace_with( BeautifulSoup(the_tag, 'html.parser') ) # Klappt besser, da String NICHT escaped wird. Nachteil: Soup generiert komische </meta> tags
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 18:26
von BlackJack
@TheBarty: Naja es wird halt aus dem Fragment ein komplettes HTML-Dokument gemacht. *Da* kannst Du doch dann aber ganz einfach wieder an das <h1>-Element kommen. Ungetestet:
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 20:15
von TheBarty
@BlackJack: irgendwo habe ich gelesen, dass die BeautifulSoup API genau diese vorangehensweise eigentlich garnicht andenkt. replace_with soll wohl mit einer Tag Instanz verwendet werden.
Weiß jemand, wie ich the_tag.string = '<b>text</b>' als safe ausgebe?
Re: string.replace für html tags?
Verfasst: Dienstag 17. März 2015, 20:26
von BlackJack
@TheBarty: Was denkst Du denn was ``BeautifulSoup(the_tag).h1`` für einen Typ hat‽ Was Du vielleicht meinst ist das ein Element immer nur in einem Objektbaum an einer Stelle stehen kann. Also möchte man vielleicht noch `extract()` aufrufen: ``BeautifulSoup(the_tag).h1.extract()``. Ich denke aber nicht dass das wirklich nötig ist, denn der Objektbaum aus dem man das ”rausreisst” wird ja nirgends mehr (intakt) benötigt.