2016-07-08 5 views
0

Ich versuche beautifulsoup zu verwenden, um zuerst die <a> Tags in der HTML-Zeichenfolge zu entfernen, aber behalte es Inhalt. Danach möchte ich alle Tags entfernen und durch neue Zeilen ersetzen.Schöne Suppe Parsing Fehler

Die Funktion strip_tags ist von This post. Hier

ist ein Beispiel dafür, was ich zu tun versucht:

text = "<p>This is a <a>test</a></p>" 
soup = strip_tags(text, ["a"]) 
plain_text = soup.get_text("\n") 
print(plain_text) 

Aus irgendeinem Grund die Ausgabe u'This is a \ntest' ist. Wenn das <a> Tag bereits ausgezogen ist, warum denkt es dann, dass es noch da ist?

Der erwartete Ausgang ist This is a test.

Ein komplexeres Beispiel: <p>First</p><a>Link</a><p>Second</p>

Wie kann ich zwischen <p> Schlagworte zu trennen, und noch in der Lage sein, um den <a> Tag strippen? Wenn Sie soup.encode_contents() drucken, ist kein <a> da.

+0

"Dies ist ein Test". Wenn kein Tag vorhanden ist, sollte keine neue Zeile vorhanden sein. – rabz100

+0

Die Pausen sind nicht, weil es ein "a" -Tag sieht. Dies liegt daran, dass das NavigableString-Element von Soup mehrere Unicode-Strings enthält und die get_text-Funktion das \ n nach jedem Element in der NavigableString-Struktur von supp zeigt. – jinksPadlock

+0

Der Grund, warum es dort hinzugefügt wird, ist 'replacewith', wenn eine einfache Zeichenfolge einen NavigableString – keety

Antwort

-1

Die Funktion strip_tags ist von This post.

Diese Funktion ersetzt Tags rekursiv durch Text, den sie enthalten.

So wird Ihre '<a>test</a>' durch 'test' ersetzt. No '<a>' Tags dort.

-1

Es verhält sich so, weil die Funktion strip_tags NavigableStrings manipuliert. (deshalb sehen Sie alle Unicode-Umwandlungen in strip_tags)

Wenn Sie den supp.get_text ("\ n") ausführen, sieht er alle Elemente des NavigableString und fügt sogar die \ n "an den Splits hinzu obwohl es kein <a> Tag gibt.

Warum nicht einfach get_text() verwenden, um den Text mit den Tags zu entfernen?

text = "<p>This is a <a>test</a> man</p> <p> more stinking <a>p</a> tags </p>" 
plain_text = BeautifulSoup(text, 'html.parser') 
ptags = plain_text.find_all('p') 
mytext = "" 
for tag in ptags: 
    mytext = mytext + tag.get_text() + "\n" 
print(mytext) 
+0

'

Dies ist ein Test Mann

Zweiter Absatz

'. Ich möchte in der Lage sein, Absätze zu trennen. – rabz100

+0

Warum nicht find_all() p tags, loop und benutze get_text(), um die anstößigen a-Tags zu entfernen? – jinksPadlock

+0

@ rabz100 Ich habe den Code in meiner Antwort zu Schleife über den Text aktualisiert und entfernen Sie die a-Tags während der Trennung zwischen den p-Tags – jinksPadlock