Scrapy Xpath无法获得所有价格

时间:2018-04-05 22:24:24

标签: python xpath scrapy

我正在使用scrapy来抓取this page

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我可以从段落标签中获取文本而不是来自/或其中的跨度?

感谢。

2 个答案:

答案 0 :(得分:1)

问题是/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+")

答案 1 :(得分:1)

尝试以下方式获取您希望的价格。

而不是使用它:

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]