2012-04-20 19 views

risposta

9

La tua domanda ha due parti:

  1. Girando il singolo NavigableString "Questo testo è il mio" in un NavigableString, un tag, e un altro NavigableString.

  2. Sostituzione di NavigableString "Questo testo è mio" con i tre nuovi elementi.

La risposta al numero 1 dipende dalla situazione. In particolare dipende da come si determina quale parte del testo ha bisogno di collegamento. Userò un'espressione regolare per trovare la stringa "text":

from bs4 import BeautifulSoup 
data = '<p>This text is my <a href="#">text</a><p>' 

soup = BeautifulSoup(data) 
original_string = soup.p.contents[0] 

print(original_string) 
# "This text is my " 

import re 
this, text, is_my = re.compile("(text)").split(original_string) 

Ora per # 2. Non è così facile come potrebbe essere, ma è sicuramente possibile. In primo luogo, Turn text in un Tag contenente il testo del link:

text_link = soup.new_tag("a", href="#") 
text_link.string = text 

re.split() girato this e is_my in stringhe Unicode ordinarie. Li trasformano di nuovo in NavigableString s in modo che possano tornare in albero come elementi:

this = soup.new_string(this) 
is_my = soup.new_string(is_my) 

Ora usare replace_with() e insert_after per sostituire il vecchio elemento con i tre nuovi elementi:

original_string.replace_with(this) 
this.insert_after(text_link) 
text_link.insert_after(is_my) 

Ora il vostro albero dovrebbe guardare il modo in cui si vuole:

print(soup.p) 
# <p>This <a href="#">text</a> is my <a href=""></a></p> 
0

è possibile ottenere il testo del NavigableString, modificarlo, costruire nuovo modello di oggetti da testo modificato e quindi sostituire il vecchio NavigableString con questo modello a oggetti:

data = '<p>This text is my <a href="#">text</a><p>' 
soup = BeautifulSoup(data) 
original_string = soup.p.contents[0] 
new_text = unicode(original_string).replace('text', '<a href="#">text</a>') 
original_string.replaceWith(BeautifulSoup(text)) 
Problemi correlati