我正在使用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我可以从段落标签中获取文本而不是来自/或其中的跨度?
感谢。
答案 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]