2014-12-01 20 views
6

Ho una raccolta di file HTML. Desidero scorrere su di loro, uno per uno, modificando il mark-up di una particolare classe. Il codice Desidero modificare è il seguente modulo, utilizzando i seguenti nomi di classe:Sostituzione di tag di un tipo con tag di un altro in BeautifulSoup

<td class='thisIsMyClass' colspan=4> 
    <a id='123' class='thisIsMyOtherClass' href='123'>Put me Elsewhere</a> 

Ciò può verificarsi più volte nello stesso documento, con diverso testo invece di "Mettimi Altrove", ma sempre lo stesso classi.

voglio cambiare questo per essere della forma:

<font SIZE="3" COLOR="#333333" FACE="Verdana" STYLE="background-color:#ffffff;font-weight: bold;"> 
    <h2>Put Me Elsewhere</h2> 
</font> 
import os 
for filename in os.listdir('dirname'): 
replace(filename) 

def replace(filename): 
tags = soup.find_all(attrs={"thisIsMyClass"}) 

Non troppo sicuro di dove andare dopo questo o come affrontare la matrice tag? Qualsiasi aiuto sarebbe molto apprezzato. Grazie :)

+0

HTML ha alcune restrizioni sui bambini negli elementi . Potresti considerare di sostituire solo i tag . Se hai bisogno di cancellare il a causa dei loro attributi, forse sostituirli con un semplice sarebbe meglio che eliminarli del tutto. – tiffon

risposta

4

molto meglio e più bella sarebbe quello di preparare una stringa di sostituzione HTML con un segnaposto, trovare tutti td tag con thisIsMyClass classe e utilizzare .replace_with() per sostituire ciascuna:

from bs4 import BeautifulSoup 

data = """ 
<table> 
    <tr> 
     <td class='thisIsMyClass' colspan=4> 
      <a id='123' class='thisIsMyOtherClass' href='123'>Put me Elsewhere</a> 
     </td> 
    </tr> 
</table> 
""" 

replacement = """ 
<font SIZE="3" COLOR="#333333" FACE="Verdana" STYLE="background-color:#ffffff;font-weight: bold;"> 
    <h2>{text}</h2> 
</font> 
""" 

soup = BeautifulSoup(data, 'html.parser') 
for td in soup.select('td.thisIsMyClass'): 
    td.replace_with(BeautifulSoup(replacement.format(text=td.a.text), 'html.parser')) 

print soup.prettify() 

Stampe:

<table> 
    <tr> 
     <font color="#333333" face="Verdana" size="3" style="background-color:#ffffff;font-weight: bold;"> 
      <h2> 
      Put me Elsewhere 
      </h2> 
     </font> 
    </tr> 
</table> 
1

È semplice come assegnare all'attributo name.

# for quick testing: 
# tag = BeautifulSoup("<td class='thisIsMyClass' colspan=4><a id='123' class='thisIsMyOtherClass' href='123'>Put me Elsewhere</a>") 
# tags = [tag] 
for tag in tags: 
    tag.td.name = "font" 
    tag.font["SIZE"] = 3 
    del tag.font["class"] 
    ... 
    tag.a.name = "h2" 
    ... 
    print(tag) 
    # <font SIZE="3" colspan="4"><h2 class="thisIsMyOtherClass" href="123" id="123">Put me Elsewhere</h2></font> 

Anche il documentation è tuo amico. È abbastanza completo.

Problemi correlati