在scrapy中无法使用列表理解来获取某些链接

时间:2019-03-08 07:03:56

标签: python python-3.x web-scraping scrapy

我已经在python中使用scrapy编写了一个脚本,以便在向特定网址发出发布请求后从响应中获取链接。当我尝试使用以下脚本时,链接完全可以通过。

工作人:

import scrapy
from scrapy.crawler import CrawlerProcess

class AftnetSpider(scrapy.Spider):
    name = "aftnet"
    base_url = "http://www.aftnet.be/MyAFT/Clubs/SearchClubs"

    def start_requests(self):
        yield scrapy.FormRequest(self.base_url,callback=self.parse,formdata={'regions':'1,3,4,6'})

    def parse(self,response):
        for items in response.css("dl.club-item"):
             for item in items.css("dd a[data-toggle='popover']::attr('data-url')").getall():
                yield {"result_url":response.urljoin(item)}

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',

    })
    c.crawl(AftnetSpider)
    c.start()

但是,我的目的是使用列表理解来达到相同的目的,但是我遇到了一些错误。

使用列表理解:

def parse(self,response):
    return [response.urljoin(item) for items in response.css("dl.club-item") for item in items.css("dd a[data-toggle='popover']::attr('data-url')").getall()]

我收到以下错误:

2019-03-08 12:45:44 [scrapy.core.scraper] ERROR: Spider must return Request, BaseItem, dict or None, got 'str' in <POST http://www.aftnet.be/MyAFT/Clubs/SearchClubs>
  

如何在scrapy内使用列表理解功能获得一些链接?

1 个答案:

答案 0 :(得分:1)

您的带有循环的生成器在每次调用时都返回一个dict

yield {"result_url":response.urljoin(item)}

但是您的列表理解返回的是字符串列表。我不知道为什么要在这里进行列表理解:生成器更容易理解(事实证明,您已经可以使用它了,但是列表理解遇到了麻烦),但是如果您坚持要这样做,您需要的是dicts而不是字符串的列表,例如

return [{"result_url":response.urljoin(item)} for items in response.css("dl.club-item") for item in items.css("dd a[data-toggle='popover']::attr('data-url')").getall()]

但是请不要那样做。请记住,可读性很重要。您的生成器可读,而单行代码不可读。