2014-12-01 7 views
6

Ich habe eine Sammlung von HTML-Dateien. Ich möchte sie einzeln nacheinander überarbeiten und den Aufschlag einer bestimmten Klasse bearbeiten. Der Code, den ich bearbeiten mag, ist in der folgenden Form, die folgenden Klassennamen:Austauschen von Tags einer Art mit Tags eines anderen in BeautifulSoup

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

Diese mehrmals im selben Dokument mit unterschiedlichem Text anstelle von „Put me Anderswo“ auftreten kann, aber immer die gleiche Klassen.

Ich möchte dies in der Form zu sein, zu ändern:

<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"}) 

nicht sicher, wo danach gehen oder wie man mit den Array-Tags umgehen? Jede Hilfe würde sehr geschätzt werden. Danke :)

+0

HTML hat einige Einschränkungen für Kinder in

Elemente. Vielleicht möchten Sie nur die Tags ersetzen. Wenn Sie die aufgrund ihrer Attribute löschen müssen, wäre es vielleicht besser, sie durch eine einfache zu ersetzen, als sie insgesamt zu löschen. – tiffon

Antwort

4

Viel besser und schöner wäre ein Ersatz HTML-String mit einem Platzhalter zu erstellen, finden Sie alle td Tags mit thisIsMyClass Klasse und verwenden .replace_with() jeweils zu ersetzen:

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

Drucke:

<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

Es ist so einfach wie die Zuweisung an die name Attribut.

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

Auch die documentation ist dein Freund. Es ist ziemlich umfassend.

Verwandte Themen