2016-06-16 6 views
0

私はBeautifulSoupでウェブサイトを掻き集めることを学んでいて、うまくいっています。コードを借用して、私は特定のウェブサイトを掻き集めることができました。しかし、私が下のウェブサイトにアクセスしたとき、私はテーブルの一番上の列を返すだけです。私はhtmlでウェブサイトコーダーがヘッダー行にthタグの代わりにtdタグを作ったことに気付きました。それが私の問題を引き起こしているのではないかと思っていました。もしそうなら、回避策はありますか?私は明白な何かを欠いていますか私は別のパーサーを使ってみました。Python BeautifulSoup一番上に戻る

url = 'https://www.twinspires.com/php/brisstats/report.php?bris_id=4061015&report=activity' 
    soup = BeautifulSoup(urllib2.urlopen(url).read(), 'html5lib') 

    data = [] 
    table = soup.find('table', attrs={'id':'reporttable'}) 
    rows = table.findAll('tr') 

    for row in rows: 
     print row 
     cols = table.find_all('td') 
     cols = [ele.text.strip() for ele in cols] 
     data.append([ele for ele in cols if ele]) # Get rid of empty values 
    print data 

アイドル状態の印刷行の出力とデータ文

<tr> 
<td class="field-title" width="15%">Activity</td> 
<td class="field-title" width="10%">Date</td> 
<td class="field-title" width="10%">Track</td> 
<td class="field-title" width="9%">Distance</td> 
<td class="field-title" width="5%">Surf</td> 
<td class="field-title" width="5%">Cond</td> 
<td class="field-title" width="9%">Time</td> 
<td class="field-title" width="10%">Class</td> 
<td class="field-title" width="5%">Fin</td> 
<td class="field-title">Comment</td> 
</tr> 
[[u'Activity', u'Date', u'Track', u'Distance', u'Surf', u'Cond', u'Time', u'Class', u'Fin', u'Comment']] 
+0

あなたはテーブルの* contents *を掻き取ろうとしていると思いますか?残念ながら、(誤ってタグ付けされた)ヘッダー行を除いて、テーブル自体はJavaScriptによって生成されるため、最終的なHTMLをレンダリングする前に 'selenium'や' phantomjs'のようなものを使う必要があります。ブラウザの開発者ツールを使用してレンダリングされたHTMLを表示できます。 – MattDMo

答えて

-1

テーブル内の実際のデータは、それがBeautifulSoupに表示されていない理由である、JavaScriptを使用して移入されています。これはようである、優れたrequestsライブラリを使用して

<script> 
    var brisid ='4061015'; 
    $(document).ready(function(){ 
     var crossDomainUrl = 'https://www.twinspires.com/php/fw/php_BRIS_BatchAPI/2.3/Brisstats/activity?bris_id=4061015&username=username&password=password&output=json'; 
     $.ajax({ url: crossDomainUrl, 
      dataType: 'jsonp', 
      jsonp: 'jsonpcallback', 
      jsonpCallback: 'dispdata' 
     }); 
    }); 
</script> 

:幸いにもあなたのため

は、このコーダは、ハードコーディングされたデータは、テーブルを移入するために使用されて戻っているリモートサービス用のユーザー名とパスワードを持っています単純に:あなたは、その後data['activity']['activity-log-proc']['activity-logs']['activity-log']をループで取得することができます

>>> import requests 
>>> url = `https://www.twinspires.com/php/fw/php_BRIS_BatchAPI/2.3/Brisstats/activity?bris_id=4061015&username=username&password=password&output=json` 
>>> r = requests.get(url) 
>>> data = r.json() 
>>> data['activity']['activity-log-proc']['activity-logs']['activity-log'][0] 
{u'comment': u'bmp brk,ins to 5/16pl', u'Distance': u'1m', u'Finish': u'4', u'laid_off': [], u'country': u'USA', u'time': [], u'surface': u'T', u'track_id': u'BEL - 09', u'track_condition': u'FM', u'race_number': u'9', u'race_type': u'Race-green', u'day_evening': u'D', u'horse_name': u'Antebellum', u'race_date': u'15Jun16', u'date': u'2016-06-15 00:00:00.0', u'class': u'MCL40000'} 

全ての結果:

for i in data['activity']['activity-log-proc']['activity-logs']['activity-log']: 
    print(i['track_condition']) # etc. 
関連する問題