Невозможно получить некоторые ссылки, используя списки в scrapy - PullRequest
0 голосов
/ 08 марта 2019

Я написал скрипт на python с использованием scrapy для получения ссылок из ответа после отправки запроса на определенный URL. Ссылки отлично просматриваются, когда я пытаюсь использовать следующий скрипт.

Рабочий:

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 Ответ

1 голос
/ 08 марта 2019

Ваш генератор с циклом возвращает один 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()]

Но, пожалуйста, не делай этого. Помните, что читаемость имеет значение . Твой генератор читабелен, твой однострочный нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...