Seite 1 von 1
Beautiful Soup - tag im tag entfernen
Verfasst: Dienstag 12. August 2014, 12:25
von SimGeh
Hallo Leute,
ich versuche derzeit ein HTML-Document zu parsen. Alles funkioniert soweit auch ganz gut. Allerdings stoße ich auf mehrere kleine Probleme. Mein größtes Problem findet sich hiet:
Code: Alles auswählen
<P><FONT FACE="Arial, Helvetica"><B>Text </B>Text Text Text Text;<AUTHOR><B><AUTHORNAME>Text</AUTHORNAME>, <AUTHORNAME>Text</AUTHORNAME></B></AUTHOR></FONT></P
Im Prinzip habe ich alles gefunden was ich haben möchte. Jedoch würde ich gerne den tag von <author> bis </author> mit allem darin entfernen. Gibt es da eine einfache Möglichkeit für?
Gruß,
Simon
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Dienstag 12. August 2014, 12:40
von BlackJack
@SimGeh: Man kann das Element (und all seine Kinder) einfach durch eine leere Zeichenkette ersetzen:
Code: Alles auswählen
In [18]: soup = BeautifulSoup('<P><FONT FACE="Arial, Helvetica"><B>Text </B>Text Text Text Text;<AUTHOR><B><AUTHORNAME>Text</AUTHORNAME>, <AUTHORNAME>Text</AUTHORNAME></B></AUTHOR></FONT></P>')
In [19]: soup.author.replace_with('')
Out[19]: <author><b><authorname>Text</authorname>, <authorname>Text</authorname></b></author>
In [20]: soup
Out[20]: <html><body><p><font face="Arial, Helvetica"><b>Text </b>Text Text Text Text;</font></p></body></html>
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Dienstag 12. August 2014, 12:58
von SimGeh
Vielen Dank. Hat super funktioniert...
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 09:34
von SimGeh
Kleiner Follow-Up.
Das ganze funktioniert bisher wunderbar. Ich bin jetzt jedoch auf einen Tag gestoßen, der durch einen Punkt getrennt wird und die ganze Syntax durcheinander wirft.
Ich habe versuch durch einen backslash vor dem Punkt das Problem zu beheben. Leider kam immer folgende Fehlermeldung
SyntaxError: unexpected character after line continuation character
Ich bin mir sicher, dass die Lösung relativ einfach wird. Jedoch habe ich jetzt schon eine ganze Weile gesucht und keine Lösung gefunden.
Wenn jemand ne Idee hat wäre das super...
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 11:00
von BlackJack
@SimGeh: Die gezeigte Ausnahme hat nichts mit dem gezeigten Quelltext zu tun. Die Ausnahme sagt das Du irgendwo in Deinem Quelltext einen Backslash hast um eine logische Zeile über mehrere ”physische” Zeilen zu verteilen und das nach diesen Backslash noch ein Zeichen kommt das da nicht hingehört. Das kann zum Beispiel auch ein Leerzeichen sein. Ein Grund warum ich grundsätzlich keine Backslashes für so etwas verwende sondern lieber ein zusätzlich Paar Klammern einführe oder den Ausdruck auf mehrere aufteile.
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 11:43
von SimGeh
Sorry, ich veilleicht bisschen konfus. Also ich versuche aus meinem HTML-Code einzelne Tags zu entfernen. Das ganze funktioniert wie oben beschrieben wie folgt:
Das Problem in meinem Fall war jetzt jedoch, dass ich einen Tag habe, der durch einen Punkt getrennt ist.
Der Punkt zerschießt mit leider die ganze Syntax und für zu folgendem Fehler:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'dt'
Ich habe versucht den Punkt mit einem Backslash escapen der jedoch den vorhin zitierten Fehler versachte hat.
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 12:32
von pillmuncher
Für BeautifulSoup bedeutet soup.foo.bar, dass soup ein Element namens foo und das wiederum ein Element names bar besitzt. Wenn du ein Element hast, dass foo.bar heißt, dann kannst du vermutlich die find() Methode verwenden: soup.find('foo.bar'). Hatte das Problem noch nicht, deswegen habe ich im source code von BeautifulSoup nachgesehen und vermute, dass es so gehen müsste. Ausprobiert habe ich es nicht,
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 12:39
von BlackJack
Wobei Tagnamen mit Punkt in HTML sehr eigenartig sind, weil es die eigentlich nicht gibt.

Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 13:28
von pillmuncher
@BlackJack: Dachte ich auch erst. Ein kurzes ddg förderte den
XML-Wikipedia-Artikel zu Tage, worin ich fand:
The element tags are case-sensitive; the beginning and end tags must match exactly. Tag names cannot contain any of the characters !"#$%&'()*+,/;<=>?@[\]^`{|}~, nor a space character, and cannot start with -, ., or a numeric digit.
Wie es bei HTML ist, weiß ich nicht. Schau gleich mal.
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 13:37
von SimGeh
Ich habe ein kleines workaround gefunden:
Den Tag habe ich einfach umbenannt und anschließend dann mit replace entfernt :
Code: Alles auswählen
soup.find("sz.dt").name = "sz_dt"
soup.sz_dt.replace_with("")
Das ist etwas umständlicher aber das Ergbenis passt.
Vielen Dank für eure Hilfe!
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 10. September 2014, 13:48
von BlackJack
@pillmuncher: Dass das in XML geht wusste ich aber in Standard HTML gibt es halt keine solchen Tags. Und zwar in keiner Version.
@SimGeh: Oh warum nur!? Du bekommst doch mit `find()` das Element. Dann benennst Du es um, nur um es dann mit dem neuen Namen erneut zu suchen. Du hattest es doch schon. Das macht keinen Sinn.
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 1. Oktober 2014, 11:56
von SimGeh
@BlackJack
Im der zweiten Zeile suche ich das Element nicht sondern ich lösche es.
Re: Beautiful Soup - tag im tag entfernen
Verfasst: Mittwoch 1. Oktober 2014, 12:15
von cofi
Nachdem du es gesucht hast. Da du es aber mittels `find` gefunden hast, kannst du es auch direkt ersetzen, statt es zuerst umzubenennen, wieder zu suchen und dann zu ersetzen.