2016-04-17 1 views
1
import requests 
from bs4 import BeautifulSoup 

def findPosts(): 
    url = 'http://espn.go.com/nba/scoreboard' 
    headers = {} 
    headers['User-Agent'] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.3" 
    soup = BeautifulSoup(requests.get(url, headers = headers).text, "html.parser") 
    team1 = soup.find_all('a',{'name' : "&lpos=nba:scoreboard:team"}) 
    score1 = soup.find_all('td',{'class' : 'total'}) 
    print(team1) 
    print(score1) 

findPosts() 

Ich erhalte eine leere Liste, aber ich bin sicher, dass der URL-Quellcode die Elemente enthält, die ich angegeben habe. Gibt es etwas in der BeautifulSoup-Dokumentation, die ich verwende?BeautifulSoup Scraping keine Ausgabe

+0

Sie eine leere Liste sind empfangen, da die 'find_all' Methode eine Liste zurückgibt der WebElements, die von der Abfrage gefunden wurden, und wie die folgende Antwort besagt, dass der Inhalt dynamisch geladen wird. – n1c9

+0

Aber in der aktuellen Form der Webseite beim Ausführen des Programms, sollte es nicht den Inhalt zurückgeben, der zur Zeit/ – OntologicalSin

+0

angezeigt wird, wenn dieser Inhalt über Javascript geladen wird. Wenn es so ist, wie die Antwort sagt, dann könnte etwas wie "Selen" das sein, was Sie anstelle von bs4 verwenden müssen. – n1c9

Antwort

3

Die Daten auf dieser Seite werden dynamisch über Javascript erstellt. Wenn Sie mit der rechten Maustaste in Ihren Browser klicken -> Quelle anzeigen und nach den Ankern mit dem von Ihnen angegebenen Namen suchen, werden Sie nichts finden. Soweit ich das beurteilen kann, befinden sich alle JSON-Daten für die zu erstellende Seite bereits auf der Seite. Sie müssen also keine zusätzlichen Anforderungen stellen, um die gewünschten Daten zu erhalten.

Um die JSON-Daten auf der Seite zu finden, suchte ich nach einem der Teamnamen (Mavericks) und sah ein riesiges JavaScript-Objekt, das anscheinend die Daten enthielt, die Sie scrappen wollten.

+0

Ich versuche nur, die Teamnamen und aktuelle Scores zu verschrotten. – OntologicalSin

1

Sie können die json mit regex extrahieren und die Daten mit dict Notation zuzugreifen:

from bs4 import BeautifulSoup 
import requests 
import re 
import json 

url='http://espn.go.com/nba/scoreboard' 
headers = {} 
headers['User-Agent'] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.3" 
soup = BeautifulSoup(requests.get(url, headers = headers).text, "html.parser") 

script = soup.find_all('script')[7].get_text() 
map_search = re.search('^.*?= (\{.*);window.*', script) 
mapData = map_search.group(1) 
mapDataObj = json.loads(mapData) 
scores = mapDataObj['events'][0]['competitions'][0]['competitors'][1]['linescores'] 
name = mapDataObj['events'][0]['competitions'][0]['competitors'][1]['team']['shortDisplayName'] 
total_score = mapDataObj['events'][0]['competitions'][0]['competitors'][1]['score'] 

print 'Team: %s' % name 
for score in scores: 
    print('Score: %s' % score['value']) 
print('Total score: %s' % total_score) 

Ausgang:

Team: Pacers 
Score: 19 
Score: 24 
Score: 27 
Score: 30 
Total score: 100