gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:51:46 24 4
gpt4 key购买 nike

我正在使用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()


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

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

最佳答案

由于您的问题主要是响应中有重复项,因此请将response转换为Set。这给出了所有数据的单个实例。

不使用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并在找不到与所选内容匹配的任何元素时返回 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'

关于python - XPath和Scrapy-当标签的深度和数量不一致时,会取消链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46258500/

24 4 0