2016-09-20 4 views
3

私はscraping pro-football-reference.comに問題があります。私は "Team Offense"テーブルにアクセスしようとしていますが、div/tableをターゲットにすることはできません。 私ができる最善のは、次のとおりです。BeautifulSoup Webscraperの問題:特定のdiv /テーブルが見つかりません

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

テーブルを返すも、それは即時のdivラッパーだしません。次の試みは、「None」を返さない:

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

私はすでに単にによって異なるページを掻き取ってきました:

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

が、それは、このページに取り組んでいない理由を私は理解することはできません。以下は私が作業しているコードです。どんな助けでも大歓迎です!

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:すべてのヘルプみんなのために

感謝。以下の両方のソリューションが成功しています。とても有難い!

+1

テーブルはコメント化されています。 – Jan

+0

のコメントアウトされたセクションのすぐ下には、必要なテーブルを持つdiv_team_stats_cloneおよびdiv_team_statsというクラスを持つdiv.table_outer_container.mobile_tableにいくつかのdivがあります。これらの部門は隠されているのでしょうか? –

+0

ページソースを調べると、all_team_statsというdivが1つしか見つかりませんでした。 –

答えて

1

ここで思考のカップルは:コメントで述べたように、まず、acutalテーブルがコメントアウトされており、それ自体DOM(パーサアドホック経由でアクセス可能ではない)の一部ではありません。
このような状況では、見つかったコメントをループして、正規表現で情報を取得できます(これは大いに議論され、Stackoverflowでほとんど嫌われていますが、see here for more information)。最後に、少なくともurllib2ではなくrequestsをお勧めします。

言われているが、ここでの作業コードの例であることがこの1オーバー

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 

常に賛成パーサーソリューションは、特に正規表現の部分は非常にエラーが発生しやすいです。

1

あなたがBS4に渡す前に、ちょうどre.subでコメントを削除します。

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() 

あなたがコードを実行するときに、表が表示されます。

関連する問題