Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Scrapy中使用多个嵌套的span CSS选择器?_Python_Web Scraping_Scrapy_Css Selectors - Fatal编程技术网

Python 如何在Scrapy中使用多个嵌套的span CSS选择器?

Python 如何在Scrapy中使用多个嵌套的span CSS选择器?,python,web-scraping,scrapy,css-selectors,Python,Web Scraping,Scrapy,Css Selectors,我正在处理一个棘手的CSS选择器问题,它涉及多个嵌套跨距 (A)通常HTML/CSS如下所示: 1200欧元 (B)但也有类似的部分: 1 100 € 1 200€ 新供应商 (C)像这样: 3400欧元 /最佳:4500.00欧元 (D)像这样: 4900欧元 +税 /最佳:4900.00欧元 使用以下类型的Scrapy CSS选择器: response.css(“div.pricing strong::text”).extract() #['2500欧元'、'\n'、'

我正在处理一个棘手的CSS选择器问题,它涉及多个嵌套跨距

(A)通常HTML/CSS如下所示:


1200欧元
(B)但也有类似的部分:



1 100 €
1 200€

新供应商
(C)像这样:


3400欧元
/最佳:4500.00欧元
(D)像这样:


4900欧元
+税
/最佳:4900.00欧元

使用以下类型的Scrapy CSS选择器:

response.css(“div.pricing strong::text”).extract()
#['2500欧元'、'\n'、'\n'、'1100欧元'、'\n'、'\n'、'1200欧元'、'3999欧元'、…]
这表明上述CSS中有问题的
在选择器文本中添加了空格。因此,我尝试忽略
罢工
促销
类,使用
:not()
的各种变体如下:

response.css(“div.pricing strong:not([class*='promotion']):not([class*='strike'])::text”).extract()
# 
我还可以仅通过以下方式获得
促销价格

response.css(“div.pricing.promo price::text”).extract()
# ['1 100 €']

在这一点上,我不知道如何:

  • 得到所有的(A)价格
  • 获取所有(B)
    促销价格(仅限)
  • 没有引入空白的结果(如上所示)
  • 以上所有内容都在(最好)一个CSS选择器或行中
问:我怎样才能以最简单的方式做到这一点?


注意:我已经看到了类似的问题:

但他们并没有对我的情况提供太多帮助


更新

我无法按照@boltclock的指示完成任务,结果遭到了一次可怕的攻击,如下所示:

adPrice=aditem.css(“div.pricing strong::text”).extract_first().strip() 如果adPrice='': adPrice=aditem.css(“div.pricing span.promo price::text”)。首先提取()
因此,如果有人有更好或更优雅的解决方案…

div.new
是否仅出现在包含所有复杂度(B)的
strong
之后,而从不出现在仅包含单个价格(a)的
strong
之后

如果是:

  • 得到所有的(A)价格
  • 没有引入空白的结果(如上所示)
response.css(“div.pricing-strong:only-child::text”).extract()
请注意
::text
前面的空格被省略了,这确保您只获取直接位于
strong
中的文本-有关用法指南,请参见我对的回答的结尾

:如果缺少
div.new
意味着(a),则只有child可以确保它在出现时不匹配,因此您无需担心(B)

  • 获取所有(B)
    促销价格(仅限)
response.css(“div.pricing.promo price::text”).extract()
  • 以上所有内容都在(最好)一个CSS选择器或行中
此时,将上述两个选择器分组应该是一个简单的问题:

response.css(“div.pricing强:独生子::text,div.pricing.promo price::text”).extract()
如果
div.new
是不相关的,那么使用CSS选择器将很难做到这一点,因为没有其他方法来区分(A)和(B)。另一方面,XPath对其进行了简化:

response.xpath(//div[@class='pricing']/(strong[not(./span)]|后代::span[@class='promo-price'])/text()).extract()

正确。
div.new
似乎只出现在案例(B)中。我尝试了上面的组合,但它缺少很多项。调查显示,还有另一个价格版本(C),有一个跨度,谁知道还有多少。(我更新了我的帖子)我现在明白了为什么提取这个的最好方法是使用xpath方法。然而,我尝试了上面的内容,但只有第一部分(在
|
之前)有效,并且实际获得了除促销品之外的所有项目。第二部分生成一条错误消息。