2016-04-04 4 views
0

schrieb ich die folgende Codezeile
Python Daten Scrapper

#!/usr/bin/python 
#weather.scrapper 

from bs4 import BeautifulSoup 
import urllib 

def main(): 
    """weather scrapper""" 
    r = urllib.urlopen("https://www.wunderground.com/history/airport/KPHL/2016/1/1/MonthlyHistory.html?&reqdb.zip=&reqdb.magic=&reqdb.wmo=&MR=1").read() 
    soup = BeautifulSoup(r, "html.parser") 
    table = soup.find_all("table", class_="responsive airport-history-summary-table") 
    tr = soup.find_all("tr") 
    td = soup.find_all("td") 
    print table 


if __name__ == "__main__": 
    main() 

Wenn ich die Tabelle drucke ich die alle html erhalten (td, tr, spanne, etc.) als auch. Wie kann ich den Inhalt der Tabelle (tr, td) ohne HTML drucken?
DANKE!

Antwort

1

Sie müssen .getText() Methode verwenden, wenn Sie einen Inhalt erhalten möchten. Da find_all eine Liste von Elementen zurückgibt, müssen Sie eine davon auswählen (td[0]).

Oder Sie können zum Beispiel so tun:

for tr in soup.find_all("tr"): 
    print '>>>> NEW row <<<<' 
    print '|'.join([x.getText() for x in tr.find_all('td')]) 

Die Schleife über Druck für jede Zeile Zelle neben Zelle.

Bitte beachten Sie, dass Sie alle td 's und alle tr auf Ihre Weise finden, aber wahrscheinlich möchten Sie nur diejenigen in table bekommen.

Wenn Sie innerhalb der table für Elemente suchen möchten, müssen Sie dies tun:

table.find('tr') statt soup.find('tr) so die BeautifulSoup für tr s im table statt ganze html suchen.

IHR CODE MODIFIED (nach Ihrem Kommentar, dass es mehr Tabellen):

#!/usr/bin/python 
#weather.scraper 

from bs4 import BeautifulSoup 
import urllib 

def main(): 
    """weather scraper""" 
    r = urllib.urlopen("https://www.wunderground.com/history/airport/KPHL/2016/1/1/MonthlyHistory.html?&reqdb.zip=&reqdb.magic=&reqdb.wmo=&MR=1").read() 
    soup = BeautifulSoup(r, "html.parser") 
    tables = soup.find_all("table") 

    for table in tables: 
     print '>>>>>>> NEW TABLE <<<<<<<<<' 

     trs = table.find_all("tr") 

     for tr in trs: 
      # for each row of current table, write it using | between cells 
      print '|'.join([x.get_text().replace('\n','') for x in tr.find_all('td')]) 



if __name__ == "__main__": 
    main() 
+0

der Tat sind Sie schreiben über Technisch Delegierten festgehalten in der Tabelle. aber wenn ich versuche 'tr = table.find ('tr')' Ich bekomme den folgenden Fehler: 'AttributeError: 'ResultSet' Objekt hat kein Attribut 'find'' – malina

+0

Weil es eine Liste ist. Wenn Sie nur eine Tabelle in HTML haben, müssen Sie supp.find ('table' .... anstelle von soup.find_all ('table .... –

+0

) Aber im gesamten HTML gibt es mehr Tabellen, die ich festlege meine Suche nach einer Klasse Ich bin nicht ganz sicher, was du meinst ... – malina