2016-03-26 1 views
1

Я хочу, чтобы получить «игру игрой» информации с веб-сайта:Как обрабатывать несогласованную разметку с помощью селекторов Scrapy?

http://www.euroleague.net/main/results/showgame?gamecode=197&seasoncode=E2015#!playbyplay

Tricky код разметки:

<tr> 
     <td>8</td> 
     <td>Def Rebound</td> 
     <td>13 - 13</td> 
     <td>Zalgiris Kaunas</td> 
     <td>VECVAGARS, KASPARS</td> 
    </tr> 
    <tr class="play"> 
     <td>8</td> 
     <td>Two Pointer</td> 
     <td>15 - 13</td> 
     <td>Zalgiris Kaunas</td> 
     <td>VECVAGARS, KASPARS</td> 
    </tr> 

Когда очки сделаны в игре он использует:

<tr class="play">

вместо:

<tr>

... отделить информацию визуально. Я хочу, чтобы получить «событие после события» и мой код, который я использую не могу справиться с этим:

for sel in response.xpath('//div[@class="wp-field wp-field-content table-responsive"]//div/table/tbody/tr'): 
    item['Minute'] = sel.xpath('td[1]/text()').extract() 

Результат, который я ПОЛУЧАТЬ является:

{'Event': [u'Def Rebound'], 
'Minute': [u'19'], 
'Player': [u'KIRILENKO, ANDREI'], 
'Res_h': [u'31 - 38'], 
'Res_v': [u'31 - 38'], 
'Team_player': [u'CSKA Moscow']} 

{'Event': [], 
'Minute': [], 
'Player': [], 
'Res_h': [], 
'Res_v': [], 
'Team_player': []} 

Пустые значения появляется, когда код имеет для работы с классом «play» для «tr».

Вопрос:

Как я могу это сделать, когда у меня есть два возможных варианта разметки, которые accures в определенных случайных ситуациях?

ответ

1

Это позволит получить все, что вы хотите:

In [53]: l=['Event',        
'Minute', 
'Player', 
'Res_h', 
'Res_v', 'Team_player'] 

In [54]: table = r.xpath("//table[@class='table']") 

In [55]: for tr in table.xpath(".//tr[position() > 1]"): 
      assert dict(zip(l, tr.xpath("./td//text()").extract())) != {} 

....:  
In [56]: 

Он пропускает строку заголовка и тянет все остальное, порядок элементов в л неправильно, но идея правильная, так что я оставлю вас на рисунке что вы хотите и где, это фрагмент того, что возвращается tr.xpath("./td//text()":

[u'15', u'Shot Rejected', u'29 - 25', u'Zalgiris Kaunas', u'HANLAN, OLIVIER'] 
[u'15', u'Block', u'29 - 25', u'Real Madrid', u'NOCIONI, ANDRES'] 
[u'15', u'Off Rebound', u'29 - 25', u'Zalgiris Kaunas', u' '] 
[u'15', u'Two Pointer', u'31 - 25', u'Zalgiris Kaunas', u'VENE, SIIM-SANDER'] 
[u'15', u'Assist', u'31 - 25', u'Zalgiris Kaunas', u'RANDLE, JEROME'] 
[u'16', u'Minute', u'31 - 25', u' ', u' '] 
[u'16', u'Three Pointer', u'31 - 28', u'Real Madrid', u'NOCIONI, ANDRES'] 
[u'16', u'Assist', u'31 - 28', u'Real Madrid', u'LLULL, SERGIO'] 
[u'16', u'Two Pointer', u'33 - 28', u'Zalgiris Kaunas', u'RANDLE, JEROME'] 
[u'16', u'Foul', u'33 - 28', u'Zalgiris Kaunas', u'SAJUS, MARTYNAS'] 
[u'16', u'Foul Drawn', u'33 - 28', u'Real Madrid', u'LLULL, SERGIO'] 
[u'16', u'Free Throw In', u'33 - 29', u'Real Madrid', u'LLULL, SERGIO'] 
[u'16', u'Free Throw In', u'33 - 30', u'Real Madrid', u'LLULL, SERGIO'] 
[u'16', u'In', u'33 - 30', u'Zalgiris Kaunas', u'JANKUNAS, PAULIUS'] 
Смежные вопросы