繁体   English   中英

XPath和Scrapy-当标签的深度和数量不一致时,会取消链接

[英]XPath and Scrapy - Scraping links when the depth and quantity of a tags are inconsistent

我正在使用Scrapy的SitemapSpider来浏览Shopify商店列表。 我正在使用XPath从各自的产品系列中提取所有产品。 通常,这并不难做到。 但是,集合页面的html在站点之间以几种方式有所不同。 我将尝试总结一些必要的要点,以了解我到底要做什么:

  • 所有产品链接都在div元素内
  • 我的标签具有的祖先数量不一致
  • div元素内a标签的深度不一致
  • div元素中可以包含一个包含href的标签,也可以是一个或两个。 它因站点而异。 如果有两个,它们将是相同的
  • div元素的类名称不一致,因此为简单起见,我将其删除

因此,包含我所需的产品链接的代码可以在div元素中的多个标签具有不一致的深度,如下所示:

 <!-- Product One --> <div> <div> <div> <a href="/product_1"> </a> </div> <a href="/product_1"> </a> </div> </div> <!-- Product Two --> <div> <div> <div> <a href="/product_2"> </a> </div> <a href="/product_2"> </a> </div> </div> <!-- Product Three--> <div> <div> <div> <a href="/product_3"> </a> </div> <a href="/product_3"> </a> </div> </div> 

或者它可以在光谱的另一端,在div元素内有一个标记,深度为1,如下所示:

 <div> <a href="/product_1"> </a> </div> <div> <a href="/product_2"> </a> </div> <div> <a href="/product_3"> </a> </div> 

所以我想我会选择第一个具有包含关键字“ product”的标签的div元素,仅从第一个div元素中的标签中提取href。

  <div> <!-- I want to select this div element --> <div> <div> <a href="/product_1"> </a> </div> <a href="/product_1"> </a> </div> </div> 

我现在拥有的代码如下所示:

product_links = response.xpath('//div//a[contains(@href, "product")][1]/@href').extract()

我仍然收到重复的值,尽管很显然它没有按照我想要的去做。

如果有人真正阅读了所有这些内容,那么绝对会有所帮助!

由于您的问题主要是关于效应初探重复 ,转换responseSet 这给出了所有数据的单个实例。

不使用set:

>>> response.xpath('//div//a[contains(@href, "product")]/@href').extract()
[u'/product_1', u'/product_1', u'/product_2', u'/product_2', u'/product_3', u'/product_3']

使用Set

>>> set(response.xpath('//div//a[contains(@href, "product")]/@href').extract())
set([u'/product_3', u'/product_2', u'/product_1'])

假设问题仅针对单个 div ,则最佳做法是使用extract_first()命令仅提取第一个匹配的元素。 使用此方法的IndexError是它避免了IndexError并且在找不到与所选内容匹配的任何元素时返回None

之前:

>>> response.xpath('//div//a[contains(@href, "product")]/@href').extract_first()
[u'/product_1', u'/product_1']

因此,应为:

>>> response.xpath('//div//a[contains(@href, "product")]/@href').extract_first()
u'/product_1'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM