2016-05-22 4 views
0

Я пытаюсь сорвать топ 100 t20 batsmen с сайта icc, однако файл csv, который я получаю, пуст. В моем коде нет ошибок (по крайней мере, я не знаю о них). Вот мой файл элементМоя Scrapy не соскабливает что-либо (пустой файл csv)

import scrapy 

class DmozItem(scrapy.Item): 
    Ranking = scrapy.Field() 
    Rating = scrapy.Field() 
    Name = scrapy.Field() 
    Nationality = scrapy.Field() 
    Carer_Best_Rating = scrapy.Field() 

dmoz_spider файл

import scrapy 

from tutorial.items import DmozItem 

class DmozSpider(scrapy.Spider): 
    name = "espn" 
    allowed_domains = ["relianceiccrankings.com"] 
    start_urls = ["http://www.relianceiccrankings.com/ranking/t20/batting/"] 

    def parse(self, response): 
     #sel = response.selector 
     #for tr in sel.css("table.top100table>tbody>tr"): 
     for tr in response.xpath('//table[@class="top100table"]/tr'): 
      item = DmozItem() 
      item['Ranking'] = tr.xpath('//td[@class="top100id"]/text()').extract_first() 
      item['Rating'] = tr.xpath('//td[@class="top100rating"]/text()').extract_first() 
      item['Name'] = tr.xpath('td[@class="top100name"]/a/text()').extract_first() 
      item['Nationality'] = tr.xpath('//td[@class="top100nation"]/text()').extract_first() 
      item['Carer_Best_Rating'] = tr.xpath('//td[@class="top100cbr"]/text()').extract_first() 
      yield item 

, что случилось с моим кодом?

+0

Я мало знаю о scrapy, но где вы запрашиваете html или пишите на csv? –

+0

@ cricket_007 in sel.css Я передаю имя класса таблицы, это цикл for для извлечения всех строк, и каждый класс в элементах - это имя класса, упомянутое в html, относящееся к списку элементов, например, название «Ranking» имеет класс = top100id. Надеюсь, это было то, о чем вы спрашивали? – hyeri

+0

только что видел отредактированный пост. Я написал файл csv с помощью команды «scrapy crawl espn -o items.csv» – hyeri

ответ

2

Веб-сайт, который вы пытаетесь отрезать, имел в нем рамку, которую вы хотите отменить.

start_urls = [ 
    "http://www.relianceiccrankings.com/ranking/t20/batting/" 
] 

Это правильный URL-адрес

Также есть много больше вещей неправильно происходит,

  • Чтобы выбрать элементы, которые вы должны использовать response себя, вам не нужно инициируйте переменную с response.selector, просто выберите ее прямо от response.xpath(//foo/bar)

  • Ваш селектор css для таблицы неправильно. top100table - это класс, а не идентификатор, поэтому он должен быть .top100table, а не #top100table.

Вот только есть XPath для него:

response.xpath("//table[@class='top100table']/tr") 

tbody не является частью HTML кода, он появляется только тогда, когда вы проверяете с современным браузером.

  • extract() метод всегда возвращает список, а затем сам элемент, так что вам нужно, чтобы извлечь первый элемент, который вы найдете, как это:

item['Ranking'] = tr.xpath('td[@class="top100id"]/a/text()').extract_first()

Надеется, что это помогает, получать удовольствие выскабливание!

+0

Большое спасибо за исправление :) Создается файл csv, но проблема в том, что он извлекает только первый элемент, как для столбца «Рейтинг», это просто генерация 1 для всех бэтсменов, так же, как и в случае с «Рейтингом» и «Лучшим рейтингом карьеры», кстати, я обновил код выше :) Названия Batsmen печатаются хорошо – hyeri

+0

@hyeri удалось ли решить проблему с помощью «Ранжирование «? – Steve

0

Чтобы ответить на вашу проблему ранжирования, xpath для ранжирования начинается с «// ...», что означает «с самого начала страницы». Вам нужно, чтобы оно было относительно tr. Просто удалите '//' из каждого xpath в цикле for.

item['Ranking'] = tr.xpath('td[@class="top100id"]/text()').extract_first()