2016-10-06 9 views
2

Ich versuche, den Inhalt eines Iframes durch ein BeautifulSoup-Objekt zu ersetzen. Lassen Sie sagen, dieseSo fügen Sie dem BeautifulSoup-Objekt einen äußeren Tag hinzu

s=""" 
<!DOCTYPE html> 
<html> 
<body> 

<iframe src="http://www.w3schools.com">   
    <p>Your browser does not support iframes.</p> 
</iframe> 

</body> 
</html> 
""" 

die ursprüngliche html ist mit

dom = BeatifulSoup(s, 'html.parser') 

analysiert werden und ich erhalte die iframe mit f = dom.find('iframe')

Jetzt will ich mit einem anderen BeautifulSoup Objekt nur den Inhalt des iframe ersetzen zB das Objekt newBO. Wenn ich f.replace_with(newBO) mache, funktioniert es, aber ich verliere die Hierarchie der ursprünglichen Datei, weil das iframe-Tag weg ist. Wenn anstelle eines BeautifulSoup Objekt, das ich nur einen String hatte, konnte ich f.string = 'just a string' tun und das würde den Inhalt ersetzen, aber wenn ich f.string = newBO

ich

TypeError: 'NoneType' object is not callable

So die replace_with Ich versuche zu verwenden, aber hinzufügen ein iframe Tag an die newBO. Wie kann ich das machen? Können Sie etwas anderes vorschlagen?

+0

Mit der Funktion 'get_text()' können Sie den Inhalt unter einem Tag zurückgeben - 'f.get_text(). Replace_with (newBO)'. Lass es mich wissen, wenn es funktioniert. –

+0

@NikhilNanjappa, Text hat nichts mit Tags zu tun. 'get_text -> Ihr Browser unterstützt keine iframes.' Das würde nicht tun, was das OP will. –

Antwort

2

extract der Inhalt dann insert:

from bs4 import BeautifulSoup 
dom = BeautifulSoup(s, 'html.parser') 

f = dom.find('iframe') 
for ele in f.find_all(): 
    ele.extract() 
new = BeautifulSoup("<div>foo</div>").find("div") 
f.insert(0, new) 
print(dom) 

Was würde Ihnen:

<!DOCTYPE html> 

<html> 
<body> 
<iframe src="http://www.w3schools.com"><div>foo</div> 

</iframe> 
</body> 
</html> 

Um auch eine beliebige Zeichenfolge zu entfernen gesetzt f.string="":

f = dom.find('iframe') 

for ele in f.find_all(): 
    print(type(ele)) 
    ele.extract() 
f.string = "" 
new = BeautifulSoup("<div>foo</div>","html.parser").find("div") 
f.insert(0, new) 
print(dom) 

die dann Sie geben würde:

<!DOCTYPE html> 

<html> 
<body> 
<iframe src="http://www.w3schools.com"><div>foo</div></iframe> 
</body> 
</html> 

In diesem Fall könnten Sie auch f.append(new) verwenden, da es das einzige Element ist.

+0

Das Beispiel, das Sie zur Verfügung gestellt haben, funktioniert, aber aus irgendeinem Grund, wenn ich versuche, es in meinem Problem anzuwenden, bekomme ich einige seltsame Ergebnisse. Ich habe ein supple-Objekt in einem Wörterbuch gespeichert, wenn ich der oben beschriebenen Prozedur folge, aber anstelle von 'new' verwende ich das Objekt, das ich in meinem dom-Wörterbuch gespeichert habe, wie' f.insert (0, dom [1] ') Ich bekomme "NoneType" -Objekt hat kein Attribut "einfügen". Im Grunde wird jede Funktion von "f", die ich versuchen werde, mit diesem Argument aufzurufen, ich werde diese Antwort erhalten, jede Idee, was schief gehen könnte? – LetsPlayYahtzee

+0

@LetsPlayYahtzee. Dieser Fehler stammt von Aufrufen wie 'f = dom.find ('iframe')' gibt None zurück. Sind Sie sicher, dass der Code die Tags findet, die Sie erwarten? –

+1

Ich habe gerade festgestellt, dass ich nicht die Elemente finde, nach denen ich suche, sondern nach der Hilfe – LetsPlayYahtzee

Verwandte Themen