#python #scrapy
#python #scrapy
Вопрос:
Мой текущий паук анализирует только свойства продукта, а не item['title']
. Как мне объединить все это вместе, пример страницы:
https://universalmotors.ru/motorcycles/lifan/motorcycle-lifan-lf150-13-2017/
Мой паук:
# -*- coding: utf-8 -*-
from scrapy.spiders import SitemapSpider as CrawlSpider
from ..items import DistPracticalItem
class SitemapSpider(CrawlSpider):
name = 'sitemap3'
allowed_domains = ['universalmotors.ru']
sitemap_urls = ['https://universalmotors.ru/sitemap.xml']
# sitemap_follow = ['deal']
# sitemap_rules = [(r'^https?://sz.*deal/[0-8]{1,8}.html$', 'parse_item')]
sitemap_rules = [('/motorcycles/', 'parse_item')]
def parse_item(self, response):
item = DistPracticalItem()
# item['name'] = response.xpath('//h1[contains(@class,"good__title")]/text()').extract_first()
item['title'] = response.css("h1.good__title::text").extract()
# prop = response.xpath('normalize-space(//tr[@itemprop="additionalProperty"])').extract()
item['price'] = response.css('div.deal-info span.campaign-price').css('::text').extract_first()
# item['comments'] = response.css('div.comment div.total').css('::text').extract()
# return item
# for item in response.xpath('//tr[@itemprop="additionalProperty"]'):
for item in response.xpath('//tr[@itemprop="additionalProperty"]'):
yield {
'name': item.xpath('normalize-space(./*[@class="label_table"])').extract_first(),
'value': item.xpath('normalize-space(./*[@class="value_table"])').extract_first(),
# 'title': response.css("h1.good__title::text").extract()
}
Моя цель — получить список очищенных элементов, который будет содержать список свойств следующим образом:
Title of the Item 1| Price 1 | Property 1, Property 2, property 3
Title of the Item 2| Price 2 | Property 1, Property 2, property 3
Title of the Item 3| Price 3 | Property 1, Property 2, property 3
Ответ №1:
Вы должны предоставить полный элемент, который вы хотите очистить, ваш код выдает только свойства, а не название и цену.
Я изменил ваш код, и, похоже, он работает так, как задумано. Я удалил элемент include и некоторые комментарии, чтобы заставить его работать на моей машине.
from scrapy.spiders import SitemapSpider as CrawlSpider
class SitemapSpider(CrawlSpider):
name = 'sitemap3'
allowed_domains = ['universalmotors.ru']
sitemap_urls = ['https://universalmotors.ru/sitemap.xml']
sitemap_rules = [('/motorcycles/', 'parse_item')]
def parse_item(self, response):
item = dict()
item['title'] = response.css("h1.good__title::text").extract_first()
item['price'] = response.css('div.deal-info span.campaign-price').css('::text').extract_first()
item['properties'] = list()
for prop in response.xpath('//tr[@itemprop="additionalProperty"]'):
item['properties'].append(
{
'name': prop.xpath('normalize-space(./*[@class="label_table"])').extract_first(),
'value': prop.xpath('normalize-space(./*[@class="value_table"])').extract_first(),
}
)
yield item
Обратите внимание, что я собираю всю информацию внутри item
переменной, которая в данном случае является dict
, а в вашей — DistPracticalItem
.
В итоге вы получите следующую схему:
{
'title': string,
'price': string,
'properties': list of dicts with 'name' and 'value' as strings
}
Надеюсь, я был ясен.
Комментарии:
1. Луис, очень ценю твою помощь! Это сработало. Единственным недостатком является то, что при экспорте в CSV я получаю дополнительные символы вокруг свойств как таковых
Мотоцикл LIFAN LF150-13 (2017),,"[{'name': 'Рабочий объем (см.куб.)', 'value': '149.4'}, {'name': 'Подача топлива', 'value': 'карбюратор'}]"
Возможно ли это удалить?2. На какие символы вы ссылаетесь? Кавычки («)? Поскольку свойства — это список, scrapy пытается экспортировать его в виде строки и заключить в кавычки, попробуйте сделать это
item['properties'] = str(item['properties'])
передyield
. Я не уверен, как избежать этого без тестирования.