2014-11-18 5 views
6

Ich möchte ein Tag durch ein anderes Tag ersetzen und den Inhalt des alten Tags vor dem neuen setzen. Zum Beispiel:Schöne Suppe 4: Wie man ein Tag durch Text und ein anderes Tag ersetzt?

Ich möchte, dies ändern:

<html> 
<body> 
<p>This is the <span id="1">first</span> paragraph</p> 
<p>This is the <span id="2">second</span> paragraph</p> 
</body> 
</html> 

in diese:

<html> 
<body> 
<p>This is the first<sup>1</sup> paragraph</p> 
<p>This is the second<sup>2</sup> paragraph</p> 
</body> 
</html> 

ich alle spans mit find_all(), erhalten die Nummer aus dem id-Attribut finden leicht und ein Tag ersetzen mit einem anderen Tag mit replace_with(), aber wie ersetze ich ein Tag mit Text und ein neues Tag oder Text vor einem ersetzten Tag einfügen?

+0

+1 @alecxe - Ich sehe ihn immer schnell und genau antworten –

+0

@alecxe: Es tut mir leid, ich bin neu in Stack Overflo w und wusste nicht, dass ich das Häkchen zusätzlich zu den Upvote-Buttons verwenden soll. Danke für Ihre sehr hilfreiche Antworten! –

Antwort

5

Die Idee ist, jeden span Tag mit id Attribute (span[id]CSS Selector) zu finden, verwenden Sie insert_after() einen sup Tag eingefügt, nachdem er und unwrap() den Tag zu ersetzen damit Inhalt ist:

from bs4 import BeautifulSoup 

data = """ 
<html> 
<body> 
<p>This is the <span id="1">first</span> paragraph</p> 
<p>This is the <span id="2">second</span> paragraph</p> 
</body> 
</html> 
""" 

soup = BeautifulSoup(data) 
for span in soup.select('span[id]'): 
    # insert sup tag after the span 
    sup = soup.new_tag('sup') 
    sup.string = span['id'] 
    span.insert_after(sup) 

    # replace the span tag with it's contents 
    span.unwrap() 

print soup 

Drucke:

<html> 
<body> 
<p>This is the first<sup>1</sup> paragraph</p> 
<p>This is the second<sup>2</sup> paragraph</p> 
</body> 
</html> 
+0

Danke für Ihre sehr hilfreiche Antwort. Ich hatte die BS-Dokumentation gelesen, aber offensichtlich habe ich den Abschnitt über ** wrap() ** und ** unwrap() ** verpasst, was der Schlüssel zur Lösung dieses Problems ist. –