2014-12-05 18 views
8
import os 
from bs4 import BeautifulSoup 
do = dir_with_original_files = 'C:\FOLDER' 
dm = dir_with_modified_files = 'C:\FOLDER' 
for root, dirs, files in os.walk(do): 
    for f in files: 
     print f.title() 
     if f.endswith('~'): #you don't want to process backups 
      continue 
     original_file = os.path.join(root, f) 
     mf = f.split('.') 
     mf = ''.join(mf[:-1])+'_mod.'+mf[-1] # you can keep the same name 
              # if you omit the last two lines. 
              # They are in separate directories 
              # anyway. In that case, mf = f 
     modified_file = os.path.join(dm, mf) 
     with open(original_file, 'r') as orig_f, \ 
      open(modified_file, 'w') as modi_f: 
      soup = BeautifulSoup(orig_f.read()) 

      for t in soup.find_all('table'): 
       for child in t.find_all("table"):#*****this is fine for now, but how would I restrict it to find only the first element? 
        child.REMOVE() #******PROBLEM HERE******** 

      # This is where you create your new modified file. 
      modi_f.write(soup.prettify().encode(soup.original_encoding)) 

Cześć wszystkimUsuń pierwszy węzeł dziecko używając BeautifulSoup

Próbuję zrobić parsowanie plików przy użyciu BeautifulSoup oczyścić je nieznacznie. Funkcjonalność chcę jest, że chcę, aby usunąć pierwszą tabelę, która jest w dowolnym miejscu w tabeli, np:

<table> 
    <tr> 
    <td></td 
    </tr> 
    <tr> 
    <td><table></table><-----This will be deleted</td 
    </tr> 
    <tr> 
    <td><table></table> --- this will remain here.</td 
    </tr> 
</table> 

Obecnie mój kod jest ustawiony, aby znaleźć wszystkie tabele w tabeli i mam składa się Metoda .REMOVE(), aby pokazać, co chcę osiągnąć. Jak mogę faktycznie usunąć ten element?

Tl; dr -

  • Jak mogę dostosować mój kod, aby znaleźć tylko pierwszej tabeli zagnieżdżonej w pliku .

  • Jak mogę usunąć tę tabelę?

Odpowiedz

7

Znajdź pierwszy stolik w środku tabeli i nazywają extract() na nim:

inner_table = soup.find('table').find('table') # or just soup.table.table 
inner_table.extract() 
+0

Wielkie dzięki za odpowiedź. Czy możliwe jest również usunięcie wszystkich węzłów potomnych tabeli? :) Dzięki. –

+0

@SimonKiely masz na myśli inne wewnętrzne tagi "table" wewnątrz zewnętrznej? Dzięki. – alecxe

Powiązane problemy