[英]Scrapy Xpath unable to get all prices
我正在使用scrapy来爬行此页面
class QuotesSpider(scrapy.Spider):
name = "tesco"
start_urls = [
'https://www.tesco.com/direct/tv-offer.event?icid=offers_trade_slot1',
]
def parse(self, response):
for quote in response.xpath('//li[contains(@class,"product-tile")]'):
learningscrapyItem = crawlerItem()
learningscrapyItem['title'] = quote.xpath('.//h3/a/text()').extract_first()
price = quote.xpath('.//div[@class="buy-box-container"]/p[2]/text()').extract_first()
learningscrapyItem['price'] = price.strip()
yield (learningscrapyItem)
我在价格xpath上遇到问题,这只会拉高一些价格:
//div[@class="buy-box-container"]/p[2]/text()
通过删除text(),我想我可以看到原因,尽管如此,但拉价的原因如下所示:
<p class="price">
£189.00
</p>
没有的结构如下:
<p class="price">
<span class="from">From</span>
£549.00
</p>
所以strip()似乎正在删除这些。 Xpath是否有一种方法可以使我从段落标签中获取文本,而不能从文本标签中或跨度获取文本?
谢谢。
问题在于/text()
仅匹配直接文本子节点,并且,您正确理解,第二个示例破坏了选择器。
我只是从“ price”元素中获取所有“ text”节点,然后使用.re_first()
获取数量:
price = quote.xpath('.//div[@class="buy-box-container"]/p[2]//text()').re_first(r"\d+\.\d+")
或者,使用CSS选择器而不是XPath更简单:
price = quote.css('.buy-box-container .price').re_first(r"\d+\.\d+")
请尝试以下方式获取您想要的价格。
而不是使用此:
quote.xpath('.//div[@class="buy-box-container"]/p[2]/text()').extract_first()
尝试使用此:
quote.xpath('.//div[@class="buy-box-container"]//p[@class="price"]/text()').extract()[-1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.