2016-07-28 7 views
1

Shell screen shotSchöne Suppe Baumnavigation

Hallo:

Ich bin ein Python Neophyt so Entschuldigungen im Voraus, wenn diese Frage zu einfach ist. Ich habe wie verrückt nach einer Antwort gesucht, aber ich finde kein Beispiel, das auf meinen Fall anwendbar ist.

In Python 3 mit Beautiful Soup, versuche ich meine HTML-Baum-Referenz als eine spezifische href und dann scrape die 6 vorhergehenden numerischen Werte von der URL unten.

url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm' 

Mein Grund für vom href-Tag beginnt, ist, dass es die einzige Referenz in dem HTML-Code ist, die gleich bleibt und nicht erneut wiederholt.

In meinem Beispiel würde ich am href Tag beginnen mag:

href="./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W" 

dann die einzelnen Inhalte aus den sechs "td=class" Tags scape den Tag vorhergehenden:

936, 934, 919,957, 951, 928. 

Vielen Dank im Voraus für irgendeine Hilfe.

+0

sieht aus wie Sie die Seitendaten im .xls-Format erhalten können http://www.eia.gov/dnav/pet/xls/PET_SUM_SNDW_DCUS_NUS_W.xls kann einfacher sein, das zu analysieren? – Mono

+0

Danke. Ich habe das gesehen, war aber nur neugierig, ob jemand in Python etwas Ähnliches versucht hat. – judabomber

+0

Sie können auch [.xls in Python analysieren] (http: // stackoverflow.com/questions/2942889/lesen-parsing-excel-xls-files-with-python). Aber wenn Sie es mit BeautifulSoup tun wollen. Ich nehme an, Sie versuchen, alle Daten aus der HTML-Tabelle zu extrahieren? oder ist es nur die Zeile, die diesem spezifischen href zugeordnet ist? – Mono

Antwort

0

Das Format der Datei besteht aus einer Anzahl von Tabellen, von denen Sie als zweite interessiert sind. Da Sie den Wert des Attributs href kennen, mit dem Sie übereinstimmen möchten, besteht eine Möglichkeit, auf die benötigten Teile zuzugreifen, darin, über die Tabellenzeilen zu iterieren. Zunächst einmal ist der Wert href der gewünschte Wert.

0

zuerst den Anker wählen Sie die href verwenden, dann finden die sechs vorherigen TDs:

from bs4 import BeautifulSoup 
import requests 
url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm' 
soup = BeautifulSoup(requests.get(url).content,"html.parser") 
anchor = soup.select_one("a[href=./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W]") 
data = [td.text for td in anchor.find_all_previous("td","DataB", limit=6)] 

Wenn wir den Code ausführen, können Sie sehen, wir Text aus dem vorherigen sechs TDs erhalten:

In [1]: from bs4 import BeautifulSoup 
    ...: import requests 
    ...: url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm' 
    ...: soup = BeautifulSoup(requests.get(url).content,"html.parser") 
    ...: anchor = soup.select_one("a[href=./hist/LeafHandler.ashx?n=PET&s=W_EPOOX 
    ...: E_YIR_NUS_MBBLD&f=W]") 
    ...: data = [td.text for td in anchor.find_all_previous("td","DataB", limit=6 
    ...:)] 
    ...: 

In [2]: data 
Out[2]: ['934', '919', '957', '951', '928', '139'] 

das ganz da nicht bekommen, da es so gibt es zwei verschiedene Klassen für die td Strom2 und DataB SDO können wir die Eltern von verwenden der Anker, der ein td selbst sein wird:

In [5]: from bs4 import BeautifulSoup 
    ...: import requests 
    ...: url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm' 
    ...: soup = BeautifulSoup(requests.get(url).content,"html.parser") 
    ...: anchor_td = soup.find("a", href="./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_Y 
    ...: IR_NUS_MBBLD&f=W").parent 
    ...: data = [td.text for td in anchor_td.find_all_previous("td", limit=6)] 
    ...: 

In [6]: data 
Out[6]: ['936', '934', '919', '957', '951', '928'] 

Jetzt bekommen wir genau was wir wollen.

Schließlich konnten wir die Großeltern des Ankers dh die Haupt td dann eine Auswahl die die sowohl die in unserer Klasse Namen verwenden bekommen wählen:

href = "./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W" 
grandparent = soup.find("a", href=href).parent.parent 
data = [td.text for td in grandparent.select("td.Current2,td.DataB")] 

Wieder Daten geben uns die gleiche Ausgabe.

+0

Dank einer Million Herren, ich schätze es wirklich. – judabomber