Проблема в div / div [2] .Crawler не выполняет итерацию, поскольку вы указали конкретное число div.Вместо этого вы можете указать селектор для div, например. div [@ class = "paper"] в этом случае, а затем код работает нормально.
Вот исправленный код:
class PaperCrawler(Spider):
name = "PaperCrawler"
allowed_domains = ["proceedings.mlr.press"]
start_urls = ["http://proceedings.mlr.press/v97/", ]
def parse(self, response):
papers = Selector(response).xpath('//*[@id="content"]/div/div[@class="paper"]')
titles = Selector(response).xpath('//*[@id="content"]/div/div[@class="paper"]/p[1]')
pdfs = Selector(response).xpath('//*[@id="content"]/div/div[@class="paper"]/p[3]/a[2]')
sups = Selector(response).xpath('//*[@id="content"]/div/div[@class="paper"]/p[3]/a[3]')
for title, pdf, sup in zip(titles, pdfs, sups):
item = PapercrawlerItem()
item['title'] = title.xpath('text()').extract()[0]
item['pdf'] = pdf.xpath('@href').extract()[0]
item['sup'] = sup.xpath('@href').extract()[0]
yield item
Итерируя документы и проверяя длину sup
можно исправить
class PaperCrawler(Spider):
name = "PaperCrawler"
allowed_domains = ["proceedings.mlr.press"]
start_urls = ["http://proceedings.mlr.press/v97/", ]
def parse(self, response):
papers = Selector(response).xpath('//*[@id="content"]/div/div[@class="paper"]')
for paper in papers:
item = PapercrawlerItem()
item['title'] = paper.xpath('p[1]/text()').extract()[0]
item['pdf'] = paper.xpath('p[3]/a[2]/@href').extract()[0]
_sup_data = paper.xpath('p[3]/a[3]/@href').extract()
item['sup'] = '' if len(_sup_data) == 0 else (_sup_data[0] if 'github' not in _sup_data[0] else '')
yield item