Сбор данных между двумя промежутками scrapy - PullRequest
3 голосов
/ 13 июля 2020

Я просматриваю веб-страницы и хочу получить информацию о ценах на все продукты на первой странице. Ниже html сети. Я хочу получить 99.

<div class = 'item-bg'>
    <div class = 'product-box'>
        <div class = 'res-info'>
            <div class = 'price-box'>
                <span class = 'def-price selectorgadget_rejected'>
                    <i>$</i>
                    99
                    <i>.99</i>
                </span>
            </div>
        </div>
    </div>
</div>

Я не думаю, что могу использовать класс def-price, потому что у некоторых продуктов есть «selectorgadget_rejected», а у некоторых продуктов - «selectorgadget_suggested» после него. Мой код сейчас:

product_info = response.css('.item-bg')
for product in product_info:
    product_price_sn = product.css('.price-box').extract() 

Он не получает 99, и я не уверен, как это исправить. Есть идеи?

Вот скриншот с полной HTML информацией: suning html

1 Ответ

1 голос
/ 13 июля 2020

Я всегда предпочитаю использовать XPath вместо CSS. В XPath вы можете использовать функцию contains, чтобы указать, какие классы вы хотите выбрать, например:

response.xpath('//span[contains(@class, "def-price selectorgadget")]//text()').extract() 
  • Это будет извлекать текст из ALL тегов <span> на странице, на которой этот класс содержал выражение def-price selectorgadget, будь то selectorgadget_rejected или selectorgadget_suggested.

Или с использованием предварительно выбранного product_info:

product_info = response.css('.item-bg')
for product in product_info:
    product_price_sn = product.xpath('div/div/div/span[contains(@class, "def-price selectorgadget")]//text()').extract() 

Использование полного пути, потому что был опубликован только фрагмент HTML

Если вы хотите, чтобы только 99 за пределами , теги <i> использовали /text() вместо //text()

CSS Селектор

Теперь, если вы хотите придерживаться селекторов CSS, этот может работать:

product.css('.price-box span::text').extract()
...