Данные не могут быть получены с несколькими именами классов в scrapy с использованием Python - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно получить данные из html, но response.css, response.xpath и их комбинация не работают всякий раз, когда я пытаюсь получить данные «обычной цены», они всегда говорят «нет»

Мне нужночтобы получить текст значения enter code here, что составляет $ 17,99

вот мой код

HTML

<div class="price parbase"><div class="primary-row product-item-price product-item-price-discount"> <span class="price-value">$12.99</span><small class="js-price-value-original price-value-original">$17.99</small> </div> </div>

Scrapy Python

def parse_subpage(self, response):
    item = {
    'title': response.css('h1.primary.product-item-headline::text').extract_first(),
    'sale-price': response.xpath("normalize-space(.//span[@class='price-value']/text())").extract_first(), 
    'regular-price': response.css('.js-price-value-original').xpath("@small").extract_first(),
    'photo-url': response.css('div.product-detail-main-image-container img::attr(src)').extract_first(),
    'description': response.css('p.pdp-description-text::text').extract_first()

        }   
    yield item

вывод должен быть по обычной цене: $ 17,99

пожалуйста, помогите, спасибо!

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Ваша ссылка дает мне 404, но по вашему фрагменту HTML вам нужно только response.css('small.js-price-value-original::text').get(), атрибута нет small.

UPD: Хм, кажется, эти данные отображаются JS. Проверьте HTML-код страницы, и вы увидите огромный JSON, поиск по ключевому слову whitePrice. Вы можете получить такие данные, например, с response.xpath('//script[contains(text(), "whitePrice")]/text()').re_first("'whitePrice'\s?:\s?'([^']+)'")

0 голосов
/ 03 апреля 2019

Спасибо, @vezunchik.Если вы хотите использовать селектор CSS.Вы можете использовать следующий код

response.css('script:contains("whitePrice")').re_first("'whitePrice'\s?:\s?'([^']+)'")
0 голосов
/ 03 апреля 2019

Если этот фрагмент является единственным HTML, который вы имеете, вы можете сделать:

def parse_subpage(self, response):
    item = {
    'title': response.css('h1.primary.product-item-headline::text').extract_first(),
    'sale-price': response.xpath("normalize-space(.//span[@class='price-value']/text())").extract_first(),
    'regular-price': response.xpath('//div/small[contains(@class, "js-price-value-original") and contains(@class, "price-value-original")]/text()').extract_first(),
    'photo-url': response.css('div.product-detail-main-image-container img::attr(src)').extract_first(),
    'description': response.css('p.pdp-description-text::text').extract_first()

        }   
    yield item

Кстати, веб-сайт, который вы указали, показывает file not found

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