2016-10-02 7 views
0

シンプルなWebスクレイプを実行しようとしています。目標は、dt gm tmとntvクラスをcsvにダンプすることです。ここでは分かりやすくするためにjsonです。一歩ずつ。ここ 治療NBAスケジュールが正しく照合されない

はクモです:

import scrapy 

class QuotesSpider(scrapy.Spider): 
    name = "schedule" 
    start_urls = [ 
     'http://www.nba.com/schedules/national_tv_schedule/', 
    ] 

    def parse(self, response): 
     for game in response.css('td'): 
      yield { 
       'date': game.css('td.dt::text').extract(), 
       'time': game.css('td.tm::text').extract(), 
      } 

は本当に簡単 - しかし、そのように吐き出す:

[ 
{"date": ["Sat, Oct 1", " ", "Sun, Oct 2", "Mon, Oct 3", " ", " ", " ", " ", " ", " "], "time": ["7:30 pm", "8:00 pm", "8:00 pm", "2:30 pm", "8:00 pm", "8:00 pm", "8:30 pm", "9:00 pm", "10:00 pm", "10:00 pm", "7:00 pm", "7:00 pm", "8:00 pm", "8:00 pm", "10:00 pm", "10:30 pm", "2:30 pm", "7:00 pm", "10:00 pm", "10:30 pm", "7:00 pm", "7:00 pm", "7:30 pm", "7:30 pm", "8:00 pm", "10:30 pm", "10:00 pm"]}, 
{"date": [], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": []}, 
{"date": ["Sat, Oct 1"], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["7:30 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["8:00 pm"]}, 
{"date": [], "time": []}, 
{"date": ["Sun, Oct 2"], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["8:00 pm"]}, 
{"date": [], "time": []}, 
{"date": ["Mon, Oct 3"], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["2:30 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["8:00 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["8:00 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["8:30 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["9:00 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["10:00 pm"]}, 
{"date": [], "time": []}, 
{"date": [" "], "time": []}, 
{"date": [], "time": []}, 
{"date": [], "time": ["10:00 pm"]}, 
{"date": [], "time": []} 
] 

最初の辞書には、正しい順序で正しいデータを持っていますが、ない(簡略化のために切り捨て)照合。次のdictは、最初のdictのデータを正しく一致させていません。私は改行を取るためにwhile文を試しましたが、失敗しました。

提案がありますか?私はScrapyチュートリアルを使ってこれを構築しました。私は最終的に正しい日付を挿入する必要があることを知っています。

答えて

0

おそらく、選択した表と行によって具体的になりたいと思うかもしれません。

は、スケジュールの開始のためのHTMLを見てみましょう:

<div id="scheduleMain" style="margin:0 5px 0 0!important;"> 
    <table border="0" cellpadding="0" cellspacing="0" class="genSchedTable tvindex"> 
     <tr class="header"> 
     <td colspan="4">NATIONAL TV SCHEDULE - 2016-17</td> 
     </tr> 
     <tr class="title"> 
     <td class="date">Date</td> 
     <td class="game">Teams</td> 
     <td class="time">Time (ET)</td> 
     <td class="natTV">Network</td> 
     </tr> 
     <tr> 
     <td class="dt">Mon, Oct 3</td> 
     <td class="gm"><a href="/thunder">Oklahoma City</a> @ <a href="/real_madrid">Real Madrid</a><br>Preseason 

     </td> 
     <td class="tm">2:30 pm</td> 
     <td class="ntv"><img border="0" src="http://i.cdn.turner.com/nba/nba/images/shrinkee_NBATV.gif"><img border="0" src="http://i.cdn.turner.com/nba/nba/images/shrinkee_NBAC.gif"></td> 
     </tr> 
     ... 

あなたは後にしている表が<div id="scheduleMain">内にあることがわかります。

そして、あなたが選択する必要があり、テーブルの行(<tr>)、時刻と日付のためのあなたのforループ、および各ループの反復で、選択した細胞ではない表のセルには:

def parse(self, response): 
    for game in response.css('#scheduleMain > table tr:nth-child(n+3)'): 
     yield { 
      'date': game.css('td.dt::text').extract(), 
      'time': game.css('td.tm::text').extract(), 
     } 

tr:nth-child(n+3)行3を選択するために使用されます、4,5(最初の2行はヘッダーです)

+0

response.css文字列の最後には引用符が必要です。それははるかにうまくいく、あなたの助けをあなたにそんなにありがとう! – areeekay

+0

右オタクについては申し訳ありません –

関連する問題