2016-10-06 7 views
2

iframeの内容をBeautifulSoupオブジェクトに置き換えようとしています。今、私は別のBeautifulSoupオブジェクトとのiframeのコンテンツのみを交換する場合は、このBeautifulSoupオブジェクトに外部タグを追加する方法

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

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

</body> 
</html> 
""" 

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

で解析され、元のHTMLであると私はf = dom.find('iframe')

ではiframeを取得しましょう例えば、オブジェクトnewBO。もし私がすればf.replace_with(newBO) が動作しますが、iframeタグがなくなるため元のファイルの階層が失われます。代わりにBeautifulSoupオブジェクトの私はf.string = 'just a string'を行うことができ、単に文字列を持っていたし、それがコンテンツを交換するだろうが、私はf.string = newBO

をすれば、私はだから私はreplace_withを使用しますが、追加しようとしています

TypeError: 'NoneType' object is not callable

を取得した場合newBOへのiframeタグ。どうやってやるの?あなたは何か他の方法を提案できますか?

+0

'get_text()'関数を使って、タグ 'f.get_text()。replace_with(newBO)'の内容を返すことができます。それが働いたら教えてください。 –

+0

@NikhilNanjappa、テキストはタグとは関係ありません。 'get_text - >あなたのブラウザはiframeをサポートしていません。 'というように、OPが望むことはしません。 –

答えて

2

extractコンテンツその後、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) 

<!DOCTYPE html> 

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

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

をも任意の文字列を削除するには、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) 

<!DOCTYPE html> 

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

この場合、f.append(new)を唯一の要素として使用することもできます。

+0

あなたが提供した例が作品を提供していますが、何らかの理由で私が問題にそれを適用しようとしているときに、私は奇妙な結果を得ています。私は上記の手順に従えば辞書にスープオブジェクトを保存しましたが、 'new'の代わりに' f.insert(0、dom [1] ')のように私がdom辞書に保存したオブジェクトを使用します'' NoneType ''オブジェクトには属性 'insert''がありません。基本的に、私がこの議論を呼ぶことを試みる 'f'のあらゆる関数は、この応答を得るでしょう。 – LetsPlayYahtzee

+0

@LetsPlayYahtzeeそのエラーは 'f = dom.find( 'iframe')'のような呼び出しに由来します。返り値なし、コードがあなたが期待するタグを見つけていますか? –

+1

私はそれが私が探している要素を見つけることができないことに気づきました。 – LetsPlayYahtzee

関連する問題