2016-09-20 2 views
3

Ich habe Probleme mit Scraping profootball-reference.com. Ich versuche auf die "Team Offensive" -Tabelle zuzugreifen, kann aber nicht auf die Div/Tabelle zielen. Das Beste, was ich tun kann, ist:BeautifulSoup webscraper issue: kann bestimmte Divs/Tabellen nicht finden

soup.find('div', {'id':'all_team_stats}) 

, die die Tabelle nicht zurück, noch ist es sofort div-Wrapper. Die folgenden Versuche zurückgeben „None“:

soup.find('div', {'id':'div_team_stats'}) 
soup.find('table', {'id':'team_stats'}) 

ich schon abgeschabt verschiedene Seiten einfach durch:

soup.find('table', {'id':'table_id}) 

aber ich kann nicht herausfinden, warum es nicht auf dieser Seite arbeiten. Unten ist der Code, mit dem ich gearbeitet habe. Jede Hilfe wird sehr geschätzt!

from bs4 import BeautifulSoup 
import urllib2 

def make_soup(url): 
    page = urllib2.urlopen(url) 
    soupdata = BeautifulSoup(page, 'lxml') 
    return soupdata 

def get_player_totals(): 
    soup = make_soup("http://www.pro-football-reference.com/years/2015/") 

    tableStats = soup.find('table', {'id':'team_stats'}) 

    return tableStats 

print get_player_totals() 

EDIT:

Vielen Dank für all die Hilfe jeder. Beide der unten aufgeführten Lösungen waren erfolgreich. Sehr geschätzt!

+1

Die Tabelle ist auskommentiert. – Jan

+0

Direkt unter dem auskommentierten Abschnitt befinden sich einige Divs in div.table_outer_container.mobile_table mit den Klassen div_team_stats_clone und div_team_stats, die die Tabelle haben, die ich brauche. Sind diese divs versteckt oder so? –

+0

Als ich in der Seitenquelle nachgesehen habe, habe ich nur ein div namens all_team_stats gefunden, das extrahiert werden kann. –

Antwort

1

Ein paar Gedanken hier: Erstens, wie in den Kommentaren erwähnt, wird die aktuelle Tabelle kommentiert und ist nicht per se Teil des DOM (nicht über einen Parser adhoc zugänglich).
In dieser Situation können Sie die gefundenen Kommentare durchlaufen und versuchen, die Informationen über reguläre Ausdrücke zu erhalten (obwohl dies auf Stackoverflow, see here for more information, stark diskutiert und meist abgelehnt wurde). Last, but not least würde ich requests eher als urllib2 empfehlen.

aber sagen, dass hier ein Arbeitscodebeispiel:

from bs4 import BeautifulSoup, Comment 
import requests, re 

def make_soup(url): 
    r = requests.get(url) 
    soupdata = BeautifulSoup(r.text, 'lxml') 
    return soupdata 

soup = make_soup("http://www.pro-football-reference.com/years/2015/") 

# get the comments 
comments = soup.findAll(text=lambda text:isinstance(text, Comment)) 

# look for table with the id "team_stats" 
rx = re.compile(r'<table.+?id="team_stats".+?>[\s\S]+?</table>') 
for comment in comments: 
    try: 
     table = rx.search(comment.string).group(0) 
     print(table) 
     # break the loop if found 
     break 
    except: 
     pass 

immer für eine Parser-Lösung über diese, vor allem die regex Teil ist sehr fehleranfällig.

1

Entfernen Sie einfach die Kommentare mit re.sub bevor Sie BS4 passieren:

from bs4 import BeautifulSoup 
import urllib2 
import re 
comm = re.compile("<!--|-->") 
def make_soup(url): 
    page = urllib2.urlopen(url) 
    soupdata = BeautifulSoup(comm.sub("", page.read()), 'lxml') 
    return soupdata 

def get_player_totals(): 
    soup = make_soup("http://www.pro-football-reference.com/years/2015/") 

    tableStats = soup.find('table', {'id':'team_stats'}) 

    return tableStats 

print get_player_totals() 

Sie die Tabelle sehen, wenn Sie den Code ausführen.

Verwandte Themen