为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

30秒到达战场 2021-11-30 10:44:57
我已经使用scrapy在python中编写了一个脚本,以便在向某个网址发出发布请求后从响应中获取链接。当我尝试使用以下脚本时,链接完全通过。工作一:import scrapyfrom scrapy.crawler import CrawlerProcessclass 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 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

带有循环的生成器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()]

但请不要那样做。请记住,可读性很重要。你的发电机是可读的,你的单线不是。


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信