Извлечение элементов веб-страницы из URL-адреса элемента с помощью scrapy

#python #scrapy

#питон #скребок

Вопрос:

Я пытаюсь извлечь данные веб-страницы с помощью scrapy , и все идет хорошо, пока мне не понадобится собрать несколько элементов из URL-адреса элементов.

Веб-сайт, который я извлекаю, — это eBay, и я отправлю ответ на веб-страницу и соберу информацию об URL-адресе товаров и цене. Вот конкретный код, который я использовал:

 def parse(self, response, page_cntr):  if page_cntr gt; 5000:  return  all_cards = response.xpath('//div[@class="s-item__wrapper clearfix"]')  for card in all_cards:  loader = ItemLoader(EbayItem(), selector=card)  loader.add_xpath('name', './/h3/text()')  loader.add_xpath('price', './/span[@class="s-item__price"]//text()')  loader.add_xpath('product_url', './/a[@class="s-item__link"]//@href')  

А затем я отправлю URL-адреса продуктов в yield в виде запроса на получение URL-адреса продуктов. Я повторю следующие несколько страниц на веб-странице (для чего page_cnt она предназначена) с моим следующим кодом, но затем, когда я создаю функцию для извлечения сведений из URL-адреса продукта, у меня возникают проблемы.

Это сработает, если я настрою свой код таким образом, чтобы получить дополнительные данные вместе с тем, что описано в приведенном выше фрагменте кода:

 def parse_product_details(self, response, loader):  location = response.xpath("//span[@itemprop='availableAtOrFrom']/text()").get()  loader.add_value('location', location)  yield loader.load_item()  

Однако, если бы я хотел получить дополнительную информацию со страницы продукта, я бы подошел к ней так:

 def parse_product_details(self, response, loader):  #location = response.xpath("//span[@itemprop='availableAtOrFrom']/text()").get()    data_cards = response.xpath('//div[@class="tab-content-m"]').get()  for details in data_cards:  loader = ItemLoader(EbayItem(), selector=details)  loader.add_xpath('condition','.//div[@class="ux-layout-section__row"][3]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()')  loader.add_xpath('character','.//div[@class="ux-layout-section__row"][1]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()')  loader.add_xpath('rarity','.//div[@class="ux-layout-section__row"][8]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()')  loader.add_xpath('graded','.//div[@class="ux-layout-section__row"][4]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()')  loader.add_xpath('set','.//div[@class="ux-layout-section__row"][1]/div[@class="ux-labels-values__values"][1]/div[@class="ux-labels-values__values-content"]/div/span//text()')  yield loader.load_item()  

Но таким образом я не получаю никаких данных. Как я могу получить дополнительные сведения на странице продукта, как это было бы при использовании первых двух фрагментов кода?

Комментарии:

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не в комментариях) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.

2. лучше создайте минимальный рабочий код с реальным URL-адресом, чтобы мы могли просто скопировать его и увидеть проблему.

3. может parse_product_details быть, вам следует использовать оригинал loader вместо создания нового, loader = ItemLoader(EbayItem(), selector=details) который не знает значения оригинала loader . Возможно, вам следует дублировать оригинал loader в цикле for. И вы должны yield быть внутри for цикла. Если вы используете yield after for -loop, вы отправляете только один элемент.