Всплеск Scrapy не может найти элемент - PullRequest
0 голосов
/ 27 мая 2018

Проблема:

Я пользуюсь всплеском скрапа для очистки веб-страницы.Однако, похоже, что путь css для imageURL не возвращает никаких элементов, но пути для name и category работали нормально.(xpath и селектор копируются непосредственно из Chrome.)

Вещи, которые я пробовал:

Сначала я подумал, что это потому, что страница не была полностью загружена, когдаparse вызывается, поэтому я изменил аргумент wait для SplashRequest на 5, но это не помогло.Я также скачал копию html-ответа из графического интерфейса заставки (http://localhost:8050)) и проверил, что все xpath / селекторы хорошо работают с загруженной копией. Здесь я предположил, что этот html будет именно тем, что scrapy видит в parseпоэтому я не мог понять, почему это не будет работать внутри скриптового скрипта.

Код:

Вот мой код:

class NikeSpider(scrapy.Spider):
name = 'nike'
allowed_domains = ['nike.com', 'store.nike.com']
start_urls = ['https://www.nike.com/t/air-vapormax-flyknit-utility-running-shoe-XPTbVZzp/AH6834-400']

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest (
            url=url,
            callback=self.parse,
            args= {
                'wait': 5
            }
        )

def parse(self, response):

    name = response.xpath('//*[@id="RightRail"]/div/div[1]/div[1]/h1/text()').extract_first()
    imageURL = response.css('#PDP > div > div:nth-child(2) > div.css-1jldkv2 > div:nth-child(1) > div > div > div.d-lg-h.bg-white.react-carousel > div > div.slider-container.horizontal.react-carousel-slides > ul > li.slide.selected > div > picture:nth-child(3) > img::attr(src)').extract_first()
    category = response.css('#RightRail > div > div.d-lg-ib.mb0-sm.mb8-lg.u-full-width > div.ncss-base.pr12-sm > h2::text').extract_first()
    url = response.url


    if name != None and imageURL != None and category != None:
        item = ProductItem()
        item['name'] = name
        item['imageURL'] = imageURL
        item['category'] = category
        item['URL'] = url

        yield item

1 Ответ

0 голосов
/ 27 мая 2018

Пусть они используют другое форматирование, но для меня это (source::attr(srcset) в конце):

imageURL = response.css('#PDP > div > div:nth-child(2) > div.css-1jldkv2 > div:nth-child(1) > div > div > div.d-lg-h.bg-white.react-carousel > div > div.slider-container.horizontal.react-carousel-slides > ul > li.slide.selected > div > picture:nth-child(3) > source::attr(srcset)').extract_first()
...