Im Codebeispiel unten, 3 der 5 Elemente, die ich versuche, Rückgabewerte wie erwartet zu scracken. 2 (goals_scored und assists) gibt keine Werte zurück. Ich habe überprüft, dass die Daten auf der Webseite vorhanden sind und dass ich das korrekte Attribut verwende, aber nicht sicher, warum die Ergebnisse nicht zurückgegeben werden. Gibt es etwas Offensichtliches, das ich übersehe?Extrahieren von Webdaten mit Beautiful Soup (Python 2.7)
import sys
from bs4 import BeautifulSoup as bs
import urllib2
import datetime as dt
import time
import pandas as pd
proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)
player_name=[]
club =[]
position = []
goals_scored = []
assists = []
for p in range(25):
player_url = 'http://www.mlssoccer.com/stats/season?page={p}&franchise=select&year=2017&season_type=REG&group=goals'.format(
p=p)
page = opener.open(player_url).read()
player_soup = bs(page,"lxml")
print >>sys.stderr, '[{time}] Running page {n}...'.format(
time=dt.datetime.now(), n=p)
length = len(player_soup.find('tbody').findAll('tr'))
for row in range(0, length):
try:
name = player_soup.find('tbody').findAll('td', attrs={'data-title': 'Player'})[row].find('a').contents[0]
player_name.append(name)
team = player_soup.find('tbody').findAll('td', attrs={'data-title': 'Club'})[row].contents[0]
club.append(team)
pos = player_soup.find('tbody').findAll('td', attrs={'data-title': 'POS'})[row].contents[0]
position.append(pos)
goals = player_soup.find('tbody').findAll('td', attrs={'data-title': 'G' ,'class': 'responsive'})[row].contents[0]
goals_scored.apppend(goals)
a = player_soup.find('tbody').findAll('td', attrs={'data-title': 'A'})[row].contents[0]
assists.append(a)
except:
pass
player_data = {'player_name':player_name,
'club':club,
'position' : position,
'goals_scored' : goals_scored,
'assists' : assists,
}
df = pd.DataFrame.from_dict(player_data,orient='index')
df
Das einzige, was ich herausfinden kann, ist, dass es ein kleiner Unterschied in dem HTML-Code für die Variablen keine Daten zurück. Muss ich die Klasse = responsive in meinen Code aufnehmen? Wenn ja, irgendwelche Beispiele dafür, wie das aussehen könnte?
Position HTML: F
Tore HTML: 11
Einsicht
Danke für Ihre Eingabe und Zeit. Das funktioniert perfekt. Ich mag, wie Ihre Lösung den Code verdichtet und vereinfacht. Ich war mir des Problems mit .odd und .even Tags nicht bewusst, also danke für den Zeiger! –