2017-12-09 21 views
0

私はespnのウェブサイトからゲームのオッズを抽出しようとしています。 「moneyLine」のオッズはスクリプトに埋め込まれており、私はアクセス方法を理解できません。理想的には、私は各ゲームの行の確率を持っています。私はチーム名と得点を列で取り出すことができました。JavaScriptスクリプトからデータを抽出するための治療

scrapy shell 
fetch('http://www.espn.com/nfl/schedule/_/week/1') 
response.xpath("//script[contains(., 'moneyLine')]/text()") 

これは出力ここ

[<Selector xpath="//script[contains(., 'moneyLine')]/text()" data='\n\t\t\tvar espn = espn || {};\n\n\t\t\t// Build '>] 

は、Firefoxインスペクタウィンドウからサンプルで、私は彼らに
enter image description here

+0

これはすべてのスクリプトを1つの文字列として与えることができ、標準の文字列関数または正規表現を使用してこれを処理する必要があります。正しいJSON文字列である文字列を取得した場合は、モジュール 'json'を使用してPython辞書に変換できます。 – furas

+0

ページでは、javascriptを使用して別のURL(主にJSONデータ)からデータを読み取ることができます。 FirefoxでDevToolを使ってこのURLを見つけたら、scrapyで読むことができます。 – furas

+0

は「ページ」メソッドですか?あなたは別のURLを教えていますか? – xristian

答えて

2

あなたを隔離することはできません、 'moneyLine' の項目を見ることができていますデータは<script>data:queue:〜JSON形式)です。

標準の文字列関数(すなわち、find()、スライシング)を使用して、この部分を切り取ることができます。
そして、モジュールjsonを使って、Python辞書に変換することができます。
そして、moneyLineがこの辞書にある場所だけを見つけなければなりません。

scrapy shell 'http://www.espn.com/nfl/schedule/_/week/1' 

# get `<script>` as text 
items = response.xpath("//script[contains(., 'moneyLine')]/text()") 
txt = items.extract_first() 

# find start and end of data 
#(I found this manually checking txt) 
start = txt.find('data:') + 6 # manually found how many add to get correct JSON string 
end = txt.find('queue:') - 6 # manually found how many substract to get correct JSON string 

json_string = txt[start:end] 

# convert to python dictionary 
import json 
data = json.loads(json_string) 

# example data 
#(I found this manually using `data.keys(), data['sports'][0].keys(), etc.) 
data['sports'][0]['leagues'][0]['events'][0]['odds']['home']['moneyLine'] 
+0

ありがとうございました!これは私のところの方法のほとんどを取得します。明らかに、私はxpathとjsonといくつかのことを学んでいます...ただ時間を見つける必要があります – xristian

関連する問題