Как проверить, существует ли URL из xpath? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две функции в Scrapy.

def parse_attr(self, response):
      for resource in response.xpath(''):
        item = Item()
        item['Name'] = response.xpath('').extract()
        item['Title'] = response.xpath('').extract()
        item['Contact'] = response.xpath('').extract()
        item['Gold'] = response.xpath('').extract() 
        company_page = response.urljoin(resource.xpath('/div/@href').extract_first()) 

        if company_page:
            request = scrapy.Request(company_page, callback = self.company_data)
            request.meta['item'] = item
            yield request
        else:
            yield item

    def company_data(self, response):
        item = response.meta['item']
        item['Products'] = response.xpath('').extract()
        yield item

parse_attr вызывает company_data, когда он извлекает @href со страницы и передает его company_page, однако этот href не всегда существует,Как я могу проверить, если href существует, и если нет, остановить scrapy от перехода к другой функции?

Выше код не удовлетворяет этому условию, потому что company_page всегда true.

Я хочу, чтобы скрап прекратился, если нет href, и закончил свою работу только с уже имеющимися предметами.Если href найден, я хочу, чтобы scrap переместился к другой функции и извлек дополнительную информацию.

1 Ответ

0 голосов
/ 06 февраля 2019

response.urljoin() всегда будет возвращать что-то (базовый URL запроса), даже если аргумент пуст.Поэтому ваша переменная всегда будет содержать значение и, следовательно, будет оцениваться как True.

. Вам необходимо выполнить объединение URL-адресов внутри условного выражения.Например:

company_page = resource.xpath('/div/@href').extract_first()

if company_page:
    company_page = response.urljoin(company_page)
    request = scrapy.Request(company_page, callback = self.company_data)
    request.meta['item'] = item
    yield request
else:
    yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...