2016-12-23 8 views
1

Player名とFP列を取得しようとしています。hereです。通常、テーブル情報が必要なときは、pandasを使用してDataframeにロードするか、少なくともfind_all()メソッドをbs4で実行します。誰でもいくつかのガイダンスを持っている場合、私は非常にそれを感謝し、この難しい場所を掻き回す簡単な方法は?

import requests 
from bs4 import BeautifulSoup 

scrape_url ='http://www.numberfire.com/nba/fantasy/full-fantasy-basketball-projections' 
page = requests.get(scrape_url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}) 

soup = BeautifulSoup(page.content, "html5lib") 

script = soup.find('script', text=lambda x: x and 'NF_DATA' in x).text 
data = re.search(r'NF_DATA = (.*?);', script).group(1) 
data = json.loads(data) 
print(data) 

しかし、それは動作しませんでした:私はこのようなものをお勧めします1ページを発見しました。

答えて

3

これは実際には良い質問です。

まず、解決策に入る前に"Terms of Service"を調べて、この方法でリソースを削ることが許されているかどうかを確認してください。web-scraping citizen


問題があり、サイトをチェックし、あなたがいない場合、それはのようなものにNF_DATAを設定します、認証された場合:ブラウザの中でページを開くと、

{u'is_logged_in': False, u'FACEBOOK_APP_NAMESPACE': u'numberfire', u'FACEBOOK_APP_ID': u'103292676390270'} 

しかし、認証されていないか、またはpage.contentを調査すると、という希望のデータが実際にはHTMLにあります。scriptタグの内容を解析する必要はありません。

fpの評価は、実際の「プレーヤー」テーブルから分離されていますが、data-player-idユニークな属性を使用してそれらを一緒に「接続」することができます。まず、fpの評価を解析し、「player_id」 - >「fp値」辞書を構築します。次に、「プレーヤー」テーブルに行き、残りの情報を掻き出し、fp値を含む辞書を探します。

実装:

# parse fp ratings 
ratings = {player['data-player-id']: player.select_one(".fp.active").get_text(strip=True) 
      for player in soup.select("table.projection-table.no-fix tr[data-player-id]")} 

# parse player info 
for player in soup.select("table.projection-table.projection-table--fixed tr[data-player-id]"): 
    player_name = player.select_one(".player-info a.full").get_text(strip=True) 
    fp_rating = ratings.get(player['data-player-id']) 

    print(player_name, fp_rating) 

プリント:

(u'Russell Westbrook', u'55.1') 
(u'Anthony Davis', u'49.3') 
(u'DeMarcus Cousins', u'48.9') 
(u'James Harden', u'48.4') 
(u'LeBron James', u'48.3') 
... 
(u'Tim Hardaway Jr.', u'0.0') 
(u'Kyle Korver', u'0.0') 
(u'Dwight Howard', u'0.0') 
(u'Reggie Williams', u'0.0') 

CSS selector select() and select_one() methodsの使用に注意してください。

関連する問題