2010-01-15 57 views
8

Quiero utilizar BeautfulSoup para buscar y reemplazar <\a> con <\a><br>. Sé cómo abrir con urllib2 y luego analizar para extraer todas las etiquetas <a>. Lo que quiero hacer es buscar y reemplazar la etiqueta de cierre con la etiqueta de cierre más el descanso. Cualquier ayuda, muy apreciada.Buscar y reemplazar en HTML con BeautifulSoup

EDITAR

yo asumiría que sería algo similar a:

soup.findAll('a'). 

En la documentación, hay una:

find(text="ahh").replaceWith('Hooray') 

Así que supongo que sería a lo largo de las líneas de:

soup.findAll(tag = '</a>').replaceWith(tag = '</a><br>') 

Pero eso no funciona y la ayuda pitón() no da mucha

Respuesta

15

Esto insertará una etiqueta <br> después del final de cada elemento <a>...</a>:

from BeautifulSoup import BeautifulSoup, Tag 

# .... 

soup = BeautifulSoup(data) 
for a in soup.findAll('a'): 
    a.parent.insert(a.parent.index(a)+1, Tag(soup, 'br')) 

No se puede utilizar soup.findAll(tag = '</a>') porque BeautifulSoup no funciona en las etiquetas de los extremos por separado: se consideran parte del mismo elemento.


Si quisiera poner las <a> elementos dentro de un elemento <p> lo que nos piden en un comentario, puede utilizar esto:

for a in soup.findAll('a'): 
    p = Tag(soup, 'p') #create a P element 
    a.replaceWith(p) #Put it where the A element is 
    p.insert(0, a)  #put the A element inside the P (between <p> and </p>) 

Una vez más, no se crea el <p> y </p> separado porque son parte de lo mismo.

+0

Will que agréguelo a cada etiqueta de apertura también? – Kevin

+0

Ver mi edición - Se agregará después de todo el elemento ..., tan eficazmente, será solo después del. – interjay

+0

¿Es BeautifulSoup.Tag válido? Me aparece un error al probar este código. – Kevin

3

No reemplaza una etiqueta final; en BeautifulSoup se trata de un modelo de objeto de documento como en un navegador, no una cadena llena de HTML. Por lo tanto, no podría "reemplazar" una etiqueta final sin reemplazar también la etiqueta de inicio.

Lo que quiere hacer es insertar un nuevo elemento <br> inmediatamente después del elemento <a>...</a>. Para hacerlo, deberá averiguar el índice del elemento <a> dentro de su elemento padre e insertar el nuevo elemento justo después de ese índice. p.ej.

soup= BeautifulSoup('<body>blah <a href="foo">blah</a> blah</body>') 
for link in soup.findAll('a'): 
    br= Tag(soup, 'br') 
    index= link.parent.contents.index(link) 
    link.parent.insert(index+1, br) 
# soup now serialises to '<body>blah <a href="foo">blah</a><br /> blah</body>' 
+0

¿Podría agregar etiquetas antes con un -1? Digamos que quería hacer

y

. ¿Podría pero el

antes de usar el índice -1 y

después de usar +1? – Kevin

+0

Agregaría un elemento * antes * del elemento elegido con solo 'index', sin más ni menos. – bobince

3

suponga que tiene un elemento que se sabe contiene las etiquetas de marcado "BR", una manera de eliminar & sustituir las etiquetas de "BR" con una cadena diferente es la siguiente:

originalSoup = BeautifulSoup("your_html_file.html") 
replaceString = ", " # replace each <br/> tag with ", " 
# Ex. <p>Hello<br/>World</p> to <p>Hello, World</p> 
cleanSoup = BeautifulSoup(str(originalSoup).replace("<br/>", replaceString)) 
+0

Ayudó. Gracias :) – subodhkalika