抓取时难以使用Xpath / CSS

时间:2019-03-14 14:47:27

标签: python css xpath scrapy

我正在尝试删除此网站:

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

我正在收集产品类别的所有URL的列表。我几乎可以全部拿到。由于某些原因,这些“更多..”选项卡确实很难获得。

我相信这与我的选择器有关。在这一点上,我试图在外壳程序中获取那些特定的“更多..” URL,以弄清楚如何正确选择它们。例如,在“笔记本电脑,台式机和显示器”部分中,“更多..”类别具有href =“ / en / laptops-desktops-monitors”。它紧随“监视器”类别之后,带有href =“ / en / monitors”。

这就是我想做的。

我打开一个易碎的外壳:

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']

如您所见,它从“显示器”类别跳到“键盘”类别,我不知道为什么。第四个索引应该具有一个值“ / en / laptops-desktops-monitors”,该值在该列表的其他位置都没有,因为我已经在搜索它了。

它应该显示在第4个索引中,但它没有...任何想法,这是怎么回事?

2 个答案:

答案 0 :(得分:0)

由于某些原因,这些“更多”链接并不总是显示在页面中: enter image description here

我也得到这个: enter image description here

请注意,在一个版本中,它具有“更多”链接,在另一个版本中,标题是链接。每当我清除缓存时,我都会得到第二个版本。 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 :(得分:0)

之所以无法获得Laptops, desktops & monitors,是因为该链接没有类category-navigation--link。使用下面的xpath可以检索类别标题和导航链接。

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