Сложность использования Xpath / CSS при очистке

#python #css #xpath #scrapy

#python #css #xpath #scrapy

Вопрос:

Я пытаюсь очистить этот веб-сайт:

https://www.coolblue.nl/en/our-assortment

Я собираю список всех URL-адресов для категорий продуктов. Я могу получить почти все из них. По какой-то причине эти вкладки «More ..» действительно трудно получить.

Я полагаю, что это как-то связано с моими селекторами. На данный момент я пытаюсь получить эти конкретные «Больше ..» URL-адреса в оболочке, просто чтобы выяснить, как их правильно выбирать. Например, в разделе «Ноутбуки, настольные компьютеры и мониторы» категория «Подробнее..» имеет href=»/ru/ноутбуки-настольные компьютеры-мониторы». Он идет после категории «Мониторы» с href=»/en/monitors».

Вот что я пытаюсь сделать.

Я открываю оболочку scrapy:

 scrapy shell https://www.coolblue.nl/en/our-assortment
  

и затем я пытаюсь выбрать то, что я хочу, по индексу. Я пробовал как Xpath, так и CSS, разными способами:

 >>> response.xpath("//a[@class='category-navigation--link']/@href")[3].getall()
['/en/monitors']
>>> response.xpath("//a[@class='category-navigation--link']/@href")[4].getall()
['/en/keyboards']

>>> response.xpath("//a[contains(@class, 'category-navigation--link')]/@href")[3].getall()
['/en/monitors']
>>> response.xpath("//a[contains(@class, 'category-navigation--link')]/@href")[4].getall()
['/en/keyboards']

>>> response.css("a.category-navigation--link::attr('href')")[3].getall()
['/en/monitors']
>>> response.css("a.category-navigation--link::attr('href')")[4].getall()
['/en/keyboards']
  

Как вы можете видеть, он перескочил из категории «Мониторы» в категорию «Клавиатуры», и я не знаю почему. Четвертый индекс должен иметь значение ‘/ru /ноутбуки-настольные компьютеры-мониторы’, которого больше нигде в этом списке нет, потому что я уже искал его.

Это должно отображаться в этом 4-м индексе, но этого не происходит… есть идеи, что происходит?

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

1. По какой-то причине ссылки «Подробнее …» не всегда отображаются на этой странице. Очистите свой кэш, и вы поймете, что я имею в виду. Даже голландская версия ( coolblue.nl/ons-assortiment ) не всегда показывает мне ссылки «Meer …». Это объясняет, почему вместо этого вы получаете следующую ссылку.

2. Елки-палки! Хороший улов! Я уже думал, что схожу с ума здесь. Я мог бы поклясться, что всего несколько дней назад этих вкладок «More ..» там вообще не было. При очистке кэша и проверке в sit становится совершенно ясно, что ссылка, которая была на этих вкладках, теперь находится в подразделах! Большое спасибо!

Ответ №1:

Причина, по которой вы не можете получить Laptops, desktops amp; monitors , заключается в том, что у этой ссылки нет класса category-navigation--link . Используйте приведенный ниже xpath, который будет извлекать как названия категорий, так и навигационные ссылки.

 //a[@class='category-navigation--link' or parent::h3[@class='product-category-navigation__title']]/@href
  

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

1. Спасибо! Мне очень нравится это решение, потому что я знаю, что scrapy не всегда будет видеть версию страницы без кэша. С этим условием внутри селектора я должен быть в состоянии закодировать его таким образом, чтобы он учитывал оба сценария.

Ответ №2:

По какой-то причине эти «Дополнительные» ссылки не всегда отображаются на странице: введите описание изображения здесь

Я также понимаю это: введите описание изображения здесь

Обратите внимание, что в одной версии он содержит ссылки «More», в другой версии заголовки являются ссылками. Всякий раз, когда я очищаю кеш, я получаю вторую версию. Scrapy также, похоже, получает версию без ссылок «Еще».

Вместо этого я бы посоветовал вам получить ссылки из меню (даже если они кажутся вам скрытыми).

Вот как вы можете получить (синие) ссылки заголовка в меню «Компьютеры и планшеты»:

 >>> response.css('#computers-tablets .product-category-navigation__title a::attr("href")').getall()
['/en/laptops-desktops-monitors', '/en/peripherals', '/en/tablets-ereaders', '/en/computer-parts', '/en/printers-scanners', '/en/memory-storage', '/en/network-internet', '/en/gaming']
  

Вот как вы можете получить ссылки под каждым заголовком:

 >>> response.css('#computers-tablets .category-navigation--item a::attr("href")').getall()
['/en/laptops', '/en/laptops/apple-macbook', '/en/desktops', '/en/monitors', '/en/keyboards', '/en/mouses', '/en/office-supplies', '/en/tablets', '/en/tablets/apple-ipad', '/en/e-readers', '/en/tablet-covers', '/en/internal-hard-drives', '/en/internal-ssd', '/en/video-cards', '/en/ram', '/en/printers', '/en/scanners', '/en/cartridges', '/en/toners', '/en/external-hard-drives', '/en/external-ssds', '/en/memory-cards', '/en/nas', '/en/routers', '/en/powerline-adapters', '/en/network-switches', '/en/wifi-repeaters', '/en/consoles', '/en/video-games', '/en/gaming-headsets', '/en/vr-gear']
  

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

1. Спасибо! Теперь все кажется прекрасным = D