2016-06-23 14 views
1

Ich versuche, bestimmte Daten von dieser [Webseite] [1] zu nehmen und schließlich in eine eigene Tabelle zu legen, außer im Moment, ich will nur in der Lage zu bekommen die Daten, die ich zeigen möchte. Mit dem unten stehenden Code kann ich alle Teams mit dem Klassen-Team dazu bringen, selbst zu erscheinen, aber ich möchte sowohl "Team-Ungerade" als auch "Team-Ungerade" haben, wenn Team-Ungerade zuerst erscheint, dann Team-Gleich.Python Parsing HTML mit BeautifulSoup

Ich bin nur darauf konzentriert, die Namen für jetzt herauszunehmen. Jede Hilfe würde sehr geschätzt werden Ich habe versucht, den ganzen Tag herauszufinden, und es ziemlich knacken! Ich habe gerade begonnen, Python zu lernen und möchte nicht, dass du mir die Antwort gibst, sondern ziele einfach in die richtige Richtung.

Danke!

import bs4, requests 
from bs4 import BeautifulSoup 
# Scraping all data from website 

url = 'http://www.scoresandodds.com/index.html' 
response = requests.get(url) 
html = response.content 
# Taking content from above and searching through it find certain elements with certain attributes 

soup = BeautifulSoup(html, "html.parser") 
table = soup.find('tbody') 

for row in table.findAll('tr', attrs={'class' : 'team even'}): 
    list_of_cells = [] 
    for cell in row.findAll('td'): 
     text=cell.text.replace(' ', '') 
     list_of_cells.append(text) 
    print(list_of_cells) 

Antwort

0

Um nur die Namen einfach ist, verwenden class_="game" Sie beide ungerade bekommen so und selbst dann ziehen Sie einfach die td mit dem Text Name:

from bs4 import BeautifulSoup 
import requests 

soup = BeautifulSoup(requests.get("http://www.scoresandodds.com/index.html").content) 

table = soup.select_one("#mlb").find_next("table") 

head = ",".join([th.text for th in table.select("tr th")]) 
print(head) 
for tr in table.find_all("tr",class_="team"): 
    print(tr.find("td","name").text.strip()) 

die Ihnen:

951 SAN FRANCISCO GIANTS 
952 PITTSBURGH PIRATES 
953 SAN DIEGO PADRES 
954 CINCINNATI REDS 
955 CHICAGO CUBS 
956 MIAMI MARLINS 
957 NEW YORK METS 
958 ATLANTA BRAVES 
959 ARIZONA DIAMONDBACKS 
960 COLORADO ROCKIES 
961 SEATTLE MARINERS 
962 DETROIT TIGERS 
963 CHICAGO WHITE SOX 
964 BOSTON RED SOX 
965 OAKLAND ATHLETICS 
966 LOS ANGELES ANGELS 
967 PHILADELPHIA PHILLIES 
968 MINNESOTA TWINS 

Um mehrere Daten zu erhalten, können Sie eine Liste von Klassen übergeben:

from bs4 import BeautifulSoup 
import requests 

soup = BeautifulSoup(requests.get("http://www.scoresandodds.com/index.html").content) 

table = soup.select_one("#mlb").find_next("table") 

head = ",".join([th.text for th in table.select("tr th")]) 
print(head) 
for tr in table.find_all("tr",class_="team"): 
    print(", ".join([td.text.strip() for td in tr.find_all("td",["name","pitcher","currentline","score"]) ])) 

Wenn wir an der Quelle betrachten, sehen Sie einige Klassennamen wiederholt werden wie Linie:

enter image description here

So können wir auch die IDs verwenden, den Strom zu erhalten und runline etc .. Daten teilweise unter Verwendung von id Text:

for tr in table.find_all("tr", class_="team"): 
    print(tr.select_one("td[id*=Pitcher]").text) 
    print(tr.select_one("td[id*=Current]").text) 
    print(tr.select_one("td[id*=Line]").text) 
    print("") 

whic würde Ihnen:

(r) surez, a 
8.5o15 
+1.5(-207) 

(l) niese, j 
-108 
-1.5(+190) 

(l) friedrich, c 
9.5o15 
+1.5(-195) 

(l) lamb, j 
-115 
-1.5(+179) 

(l) lester, j 
-156 
-1.5(-105) 

(l) chen, w 
7.5o15 
+1.5(-103) 

(r) harvey, m 
-155 
-1.5(+106) 

(r) wisler, m 
7.5u15 
+1.5(-115) 

(r) greinke, z 
-150 
-1.5(+109) 

(r) butler, e 
10.5 
+1.5(-118) 

(r) sampson, a 
10u15 
+1.5(-170) 

(l) norris, d 
-123 
-1.5(+156) 

(r) shields, j 
10o20 
+1.5(+117) 

(r) porcello, r 
-235 
-1.5(-127) 

(r) graveman, k 
8o15 
+1.5(-170) 

(r) lincecum, t 
-133 
-1.5(+156) 

(r) eickhoff, j 
8.5 
+1.5(-154) 

(r) nolasco, r 
-151 
-1.5(+142) 

Sie sollten alles zusammenfügen können, um alle gewünschten Tabellendaten zu erhalten.

+0

Vielen Dank, was mich verwirrt ist die Zeile, Tabelle = supp.select_one ("# mlb"). Find_next ("Tabelle") Es macht Sinn, mit Ausnahme der find_next ('Tabelle'), dass sich bewegt in den Reihen? Ich habe das Tisch-Tag nirgends gesagt, außer oben auf der Seite. Jede Klärung wäre großartig, danke nochmal für die Hilfe! – Beez

+0

@Beez, die Daten, die wir wollen, ist in der Tabelle nach dem div mit dieser ID, wenn Sie nur die Tabelle als in 'select_one (" Tabelle ")' oder 'find (" Tabelle ")' Sie werden sehen, wir bekommen Weg mehr Header/Spalten nicht nur 'Team, Krug, Open, Line Movements, aktuelle, Runline, Scores' –