2012-04-20 15 views

Respuesta

9

Su pregunta tiene dos partes:

  1. Al apagar la única NavigableString "Este texto es mi" en un NavigableString, una etiqueta, y otro NavigableString.

  2. Reemplazo de la cadena NavigableString "Este texto es mi" con los tres elementos nuevos.

La respuesta al # 1 depende de su situación. Específicamente, depende de cómo determine qué parte del texto necesita vincularse. Usaré una expresión regular para encontrar la cadena "texto":

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) 

Ahora para # 2. Esto no es tan fácil como podría ser, pero definitivamente es posible. En primer lugar, Turn text en un Tag que contiene el texto del enlace:

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

re.split() volvió this y is_my en cadenas Unicode ordinarios. Convertirlos de nuevo en NavigableString s para que puedan volver a entrar en el árbol como elementos:

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

Ahora usa replace_with() y insert_after para reemplazar el viejo elemento con los tres nuevos elementos:

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

Ahora su árbol debe buscar la forma que desee a:

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

usted puede obtener el texto de NavigableString, modificarlo, construir un nuevo modelo de objetos de texto modificado y luego reemplazar viejo NavigableString con este modelo de objeto:

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)) 
Cuestiones relacionadas