Я пытаюсь удалить эту страницу:
https://www.coolblue.nl/en/our-assortment
Я удаляю почти все ссылки в каждом разделе категории успешно.Но по какой-то причине все эти ссылки «Больше ..» не проходят, даже если их Xpath должен быть таким же, как и другие ссылки.
То, что я искал в своем инспекторе
То, что я сейчас делаю, ищет все значения «href», принадлежащие тегам «a» со значением класса category-navigation--link
Я использую Scrapy на Python,таким образом, я получаю информацию из своего скрипта:
response.xpath("//a[@class='category-navigation--link']/@href")
Это хорошо сработало, чтобы дать большинство ссылок на странице, за исключением этих ссылок "Еще ..", но я не могупонять, почему.Кажется, они такие же, как и другие, но селектор xpath почему-то не может получить информацию ..
РЕДАКТИРОВАТЬ: Вот мой код.Он должен работать так же, как прекрасный пример супа PS1212, размещенный здесь, с той лишь разницей, что я возвращаю ссылки.По какой-то причине он пропускает все эти URL-адреса в поле href из всех этих элементов «More ..».
import scrapy
from ..items import CoolBlueItems
class QuoteSpider(scrapy.Spider):
name = "coolblue2"
start_urls = ["https://www.coolblue.nl/en/our-assortments]
def __init__(self):
self.declare_xpath()
def declare_xpath(self):
self.getAllSubCategoriesUrlsXpath = "//a[@class='category-navigation--link']/@href"
def parse(self, response):
item = CoolBlueItems()
urls_list = []
no_scrap_urls = ["/en/promotion", "/en/second-chance", "/en/gift-cards", "/en/coolblue-fan-products", "/en/all-brands"]
for Urls in response.xpath(self.getAllSubCategoriesUrlsXpath).getall():
current_url = Urls.strip()
if current_url not in urls_list and current_url not in no_scrap_urls and current_url.count("/") == 2:
urls_list.append(current_url)
item["Url"] = response.urljoin(current_url)
yield item
Я следовал совету PS1212.Пришлось внести некоторые изменения, потому что он выдавал ошибку, связанную с обработкой информации в re.Функция:
import scrapy
from ..items import CoolBlueItems
class QuoteSpider(scrapy.Spider):
name = "coolblue2"
start_urls = ["https://www.coolblue.nl/en/our-assortments]
for a in response.css("a.category-navigation--link::attr('href')").getall():
item["Url"] = re.split('/', a)
yield item
Он по-прежнему пропускает тот элемент, который я хочу.Вот первые записи вывода:
Category,CurrentPrice,OriginalPrice,Title,Url
,,,,",en,laptops"
,,,,",en,laptops,apple-macbook"
,,,,",en,desktops"
,,,,",en,monitors"
,,,,",en,keyboards"
РЕДАКТИРОВАТЬ: Проблема была сама селектор.Я могу заставить мой скрипт работать, но мне все еще любопытно, почему селектор CSS работает, а xpath - нет.Вот тест, который я сделал, где я использую xpath и css для удаления всех элементов из разделов "a" с определенным классом:
>>> response.xpath("//a[@class='category-navigation--link']")[4].getall()
['<a class="category-navigation--link" href="/en/keyboards" rel="nofollow">\n Keyboards\n </a>']
>>>
>>> response.css('a.category-navigation--link')[4].get()
'<a class="category-navigation--link category-navigation--link--black" href="/en/laptops-desktops-monitors" data-trackclickevent="Homepage categor
y navigation|Computers & tablets|More..">\n More..\n
</a>'
Как видите, 5-й элемент массива,Индекс 4 в обоих случаях возвращает разные значения.Я, должно быть, ошибаюсь где-то в моем селекторе Xpath.