2011-01-07 7 views
5

Jestem pierwszym plakatem w tym miejscu, próbującym zebrać niektóre umiejętności Pythona; Proszę, bądź dla mnie miły :-)Pętla w zestawie danych tabeli html w Pythonie

Chociaż nie jestem całkowicie obcy w programowaniu koncepcji (wcześniej zajmowałem się PHP), przejście do Pythona okazało się dla mnie nieco trudne. Sądzę, że ma to głównie związek z tym, że brakuje mi większości - jeśli nie wszystkich - podstawowego zrozumienia wspólnych "wzorców projektowych" (?) I takich.

Mając to powiedziane, to jest problem. Częścią mojego obecnego projektu jest napisanie prostego skrobaka za pomocą pięknej zupy. Dane do przetworzenia mają nieco podobną strukturę do tej, która jest przedstawiona poniżej.

<table> 
    <tr> 
     <td class="date">2011-01-01</td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
    <tr> 
     <td class="date">2011-01-02</td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
</table> 

Głównym problemem jest to, że po prostu nie mogę uzyskać moja głowa wokół jak 1) śledzić aktualną datę (TR> td class = „date”), podczas gdy 2) zapętlenie nad elementów w kolejne tr: s (tr class = "item" -> td class = "headline" i tr class = "item" -> td class = "link") i 3) przechowują przetworzone dane w tablicy.

Dodatkowo, wszystkie dane zostaną wstawione do bazy danych, gdzie każdy wpis musi zawierać następujące informacje;

  • data
  • nagłówek
  • Link

Zauważ, że CRUD: ing bazy danych nie jest częścią problemu, ja tylko wspomniałem o tym, aby lepiej zilustrować, co usiłuję Aby to osiągnąć :-)

Teraz istnieje wiele różnych sposobów na skórze kota. Tak więc, chociaż rozwiązanie problemu jest naprawdę bardzo pożądane, byłbym niezmiernie wdzięczny, gdyby ktoś chciał opracować rzeczywistą logikę i strategię, z której skorzystasz, aby "zaatakować" ten rodzaj problemu :-)

Last but not least, przepraszam za takie noobish pytanie.

Odpowiedz

5

Podstawowym problemem jest to, że ta tabela jest zaznaczona pod kątem wyglądu, a nie struktury semantycznej. Prawidłowo wykonane, każda data i powiązane elementy powinny dzielić rodzica. Niestety nie, więc musimy to zrobić.

Podstawową strategią jest iterację każdego wiersza w tabeli

  • jeśli pierwszy tabledata ma klasy „data”, otrzymujemy wartość daty i aktualizacji last_seen_date
  • W przeciwnym razie mamy wyodrębnić nagłówek i link, a następnie zapisz (last_seen_date, headline, link) do bazy danych

.

import BeautifulSoup 

fname = r'c:\mydir\beautifulSoup.html' 
soup = BeautifulSoup.BeautifulSoup(open(fname, 'r')) 

items = [] 
last_seen_date = None 
for el in soup.findAll('tr'): 
    daterow = el.find('td', {'class':'date'}) 
    if daterow is None:  # not a date - get headline and link 
     headline = el.find('td', {'class':'headline'}).text 
     link = el.find('a').get('href') 
     items.append((last_seen_date, headline, link)) 
    else:     # get new date 
     last_seen_date = daterow.text 
+0

Cześć Hugh, zdecydowałem się pójść z twoją sugestią, to wyszło naprawdę dobrze. Dzięki za twój wysiłek! :-) – Mattias

2

Możesz użyć drzewa elementów, które jest zawarte w pakiecie Pythona.

http://docs.python.org/library/xml.etree.elementtree.html

from xml.etree.ElementTree import ElementTree 

tree = ElementTree() 
tree.parse('page.xhtml') #This is the XHTML provided in the OP 
root = tree.getroot() #Returns the heading "table" element 
print(root.tag) #"table" 
for eachTableRow in root.getchildren(): 
    #root.getchildren() is a list of all of the <tr> elements 
    #So we're going to loop over them and check their attributes 
    if 'class' in eachTableRow.attrib: 
     #Good to go. Now we know to look for the headline and link 
     pass 
    else: 
     #Okay, so look for the date 
     pass 

To powinno wystarczyć, aby dostać się na drodze do analizowania tego.

+0

Cześć, dziękuję za twoje wejście. Obecnie używam beautifulsoup do celów skrobania, ale prawdopodobnie w najbliższym czasie zajrzę do drzewa elementów. Twoje zdrowie! :-) – Mattias

Powiązane problemy