使用 python 3.8 和 scrapy 1.6,我想检查产品的星级是否等于或大于 3.5,然后检查另一个条件(如果 discount_percent 等于或大于 10%),然后抓取该产品的一些元素。问题是,我猜,scraped star 和 discount_percent 元素是非英文数字并且包含“%”。因此,虽然我使用的是 utf8,但当我将代码行包装在 float() 和 int() 函数中时,我得到了这个日志:这是我的蜘蛛代码: def parse(self, response): for product in response.xpath("//ul[@class='c-listing__items']/li"): title= product.xpath(".//a[@class='js-product-url']/text()").get() star= float(product.xpath(".//div[@class='c-product-box__engagement-rating']/text()").get()) discounted_percent= int(product.xpath(".//div[@class='c-price__discount-oval']/span/text()").get()) discounted_price= int(product.xpath(".//div[@class='c-price__value-wrapper']/text()").get()) original_price= int(product.xpath(".//div[@class='c-price__value c-price__value--plp']/del/text()").get()) url= response.urljoin(product.xpath(".//a[@class='js-product-url']/@href").get()) if star>=3.5 and discounted_percent>=10: yield{ 'title':title, 'star':star, 'discounted_percent':discounted_percent, 'discounted_price':discounted_price, 'original_price':original_price, 'url':url } 我该如何解决这个问题?感谢您的帮助!
1 回答
弑天下
TA贡献1818条经验 获得超8个赞
问题来自您正在使用的以下几行int():
discounted_percent= int(product.xpath(".//div[@class='c-price__discount-oval']/span/text()").get())
discounted_price= int(product.xpath(".//div[@class='c-price__value-wrapper']/text()").get())
original_price= int(product.xpath(".//div[@class='c-price__value c-price__value--plp']/del/text()").get())
但是,您还必须为discounted_priceand执行此original_price操作,确保没有非数字字符,例如%或 货币符号。
这是因为您不能int()在使用非数字字符的字符串上使用,例如int("20%")
一个快速的解决方案是删除这些字符。在以下情况下discounted_percent:
discounted_percent = int(str(product.xpath(".//div[@class='c-price__discount-oval']/span/text()").get().strip()).replace('٪', ''))
添加回答
举报
0/150
提交
取消