2014-11-18 2 views
6

Я хочу заменить тег другим тегом и поместить содержимое старого тега перед новым. Например:Красивый суп 4: Как заменить тег текстом и другим тегом?

Я хочу изменить это:

<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> 

в этом:

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

Я могу легко найти все spans с find_all(), получить номер с идентификатором атрибута и заменить один тег с другим тегом, используя replace_with(), но как заменить тег на текст и новым тегом или вставить текст перед замененным тегом?

+0

+1 @alecxe - Я всегда вижу, как он отвечает на него быстро и точно –

+0

@alecxe: Извините, я новичок в Stack Overflo w и не знал, что я должен использовать галочку в дополнение к кнопкам upvote. Спасибо за ваши ответы! –

ответ

5

Идея заключается в том, чтобы найти все span тег с id атрибута (span[id]CSS Selector), используйте insert_after() вставить sup тег после того, как и unwrap() заменить тег с его содержанием:

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 

Печать:

<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

Спасибо за ваш очень полезный ответ. Я прочитал документацию BS, но я, очевидно, пропустил раздел о ** wrap() ** и ** unwrap() **, который является ключом к решению этой проблемы. –

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