string.replace für html tags?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TheBarty
User
Beiträge: 4
Registriert: Dienstag 17. März 2015, 11:34

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
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Bei mir schon.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheBarty: neben der Tatsache, dass man XML-Daten nicht mit Stringoperationen bearbeiten sollte, was sind Deine wirklichen Inputdaten und was erwartest Du als Output?
TheBarty
User
Beiträge: 4
Registriert: Dienstag 17. März 2015, 11:34

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
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
BlackJack

@TheBarty: Ergänzend zu Sirius3: Wieso sollte BeautifulSoup *leere* <link>-Elemente einfügen? Glaube ich irgendwie nicht, kann ich hier auch nicht nachvollziehen.
TheBarty
User
Beiträge: 4
Registriert: Dienstag 17. März 2015, 11:34

@BlackJack: Ich weiß und ich fühle mich auch total schlecht dabei!!  :oops:

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
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:

Code: Alles auswählen

found_tag.replace_with(BeautifulSoup(the_tag).h1)
TheBarty
User
Beiträge: 4
Registriert: Dienstag 17. März 2015, 11:34

@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?
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.
Antworten