【发布时间】:2019-02-28 22:53:26
【问题描述】:
我正在处理一个涉及多个嵌套 span 的棘手 CSS 选择器问题。
(A) 通常 HTML/CSS 如下所示:
<div class="pricing">
<strong>1 200 €</strong>
</div>
(B)但也有部分是这样的:
<div class="pricing">
<strong>
<span class="promotion">
<span class="promo-price">1 100 €</span>
</span>
<span class="strike">
<span>1 200€</span>
</span>
</strong>
<div class="new">New supplier</div>
</div>
(C) 像这样:
<div class="pricing">
<strong>3 400 €</strong>
<span>/ best: 4500.00 €</span>
</div>
(D) 像这样:
<div class="pricing">
<strong>4 900 €</strong>
<span class="netto">+ taxes</span>
<span>/ best: 4900.00 €</span>
</div>
使用 Scrapy CSS 选择器的类型:
response.css("div.pricing strong ::text").extract()
# ['2 500 €', '\n ', '\n ', '1 100 €', '\n ', '\n ', '1 200€', '3 999 €',...]
这表明上述 CSS 的有问题的<span ...> 在选择器文本中添加了空格。所以我试图忽略 both strike 和 promotion 类以及使用 :not() 的各种变体,如下所示:
response.css("div.pricing strong:not([class*='promotion']):not([class*='strike'])::text").extract()
# <same result as above>
我也可以得到promo-priceonly,带有:
response.css("div.pricing .promo-price::text").extract()
# ['1 100 €']
此时我不知道如何:
- 获取所有 (A) 价格
- 获取所有 (B)
promo-prices(仅限) - 没有引入空白的结果(如上所示)
- 以上所有内容都在(最好)一个 CSS选择器或行
问:我怎样才能以最简单的方式做到这一点?
注意:我已经看过类似的问题了:
- Scrapy grab div with multiple classes?
- Using multiple CSS selectors for the same ArticleItem in Scrapy
但在我的情况下,他们并没有提供太多帮助。
更新:
我没能按照@boltclock 的指示完成任务,最后得到了一个丑陋的hack,像这样:
adPrice = aditem.css("div.pricing strong::text").extract_first().strip()
if adPrice == '':
adPrice = aditem.css("div.pricing span.promo-price::text").extract_first()
所以如果有人有更好或更优雅的解决方案...
【问题讨论】:
标签: python web-scraping scrapy css-selectors