2016-10-06 2 views
2

Я пытаюсь заменить содержимое iframe объектом BeautifulSoup. Пусть говорят, что этоКак добавить внешний тег к объекту BeautifulSoup

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

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

</body> 
</html> 
""" 

оригинальный HTML разбираемый с

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

и я получаю IFRAME с f = dom.find('iframe')

Теперь я хочу, чтобы заменить только содержимое фрейма с другим объектом BeautifulSoup , например, объект newBO. Если я делаю f.replace_with(newBO) , он работает, но я теряю иерархию исходного файла, потому что тег iframe отсутствует. Если вместо объекта BeautifulSoup я имел только строку я мог сделать f.string = 'just a string' и что бы заменить содержимое, но если я f.string = newBO

я

TypeError: 'NoneType' object is not callable

Так что я пытаюсь использовать replace_with но добавить a iframe тег к новомуBO. Как я могу это сделать? Можете ли вы предложить другой способ?

+0

Вы можете использовать функцию 'get_text()' для возврата содержимого под тегом - 'f.get_text(). Replace_with (newBO)'. Дайте мне знать, если это сработает. –

+0

@NikhilNanjappa, текст не имеет ничего общего с тегами. 'get_text -> Ваш браузер не поддерживает iframes.', так что не будет делать то, что хочет 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' я использую объект, который я сохранил в словаре dom, например' f.insert (0, dom [1] ') Я получаю объект «NoneType» не имеет атрибута «insert». В основном каждая функция 'f', которую я попытаюсь вызвать с помощью этого аргумента, я получу этот ответ, любую идею, что может пойти не так? – LetsPlayYahtzee

+0

@LetsPlayYahtzee. эта ошибка проистекает из таких вызовов, как 'f = dom.find ('iframe')' return None, вы уверены, что код находит теги, которые вы ожидаете? –

+1

Я только что понял, что он не находит элементы, которые я ищу, thtks для помощи – LetsPlayYahtzee

Смежные вопросы