X路径无法提取Spider中所需的元素

时间:2018-12-24 06:28:06

标签: python web-scraping scrapy

def parse(self, response):
    item = AmazonItem()
    item['url'] = response.url
    item['SellerName'] = response.xpath(".//*[@id='bylineInfo']/text()").extract()[0].strip()
    item['itemtitle'] = response.xpath(".//*[@id='productTitle']/text()").extract()[0].strip()
    item['rating'] = response.xpath(".//*[@class='a-icon-alt']/text()").extract()[0].strip()
    item['price'] = response.xpath(".//*[@class='a-size-medium a-color-price']/text()").extract()[0].strip()
    try:
        list = response.xpath(".//*[@class='a-unordered-list a-vertical a-spacing-none']/li/span[@class='a-list-item']/text()").extract()
        item['desc'] = [s.strip() for s in list]
    except IndexError:
        item['desc']="No Description"

在上面的代码中,我试图获取价格,标题,评论和说明(如果存在),它为存在说明的链接提取所有内容,但为没有说明的链接不写任何内容,可以提供任何帮助。以下是链接: https://www.amazon.com/Angelkiss-Leather-shoulder-backpack-K15631/dp/B01NCX988Q ---描述 https://www.amazon.com/dp/B06W9HL2L1 ---没有描述

3 个答案:

答案 0 :(得分:1)

请确保避免使用复合类。我试图展示如何定义它们。您需要做的就是将下面使用的xapth替换为您在scrapy项目中使用的xapth。

import requests
from scrapy import Selector

url = "https://www.amazon.com/dp/B01NCX988Q/?tag=stackoverflow17-20"

res = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
sel = Selector(res)
product_url = res.url
seller = sel.xpath("//a[@id='bylineInfo']/text()").extract_first()
title = sel.xpath("//*[@id='productTitle']/text()").extract_first().strip()
rating = sel.xpath("//span[@class='a-icon-alt']/text()").extract_first().strip()
price = sel.xpath("//*[@id='priceblock_ourprice']/text()").extract_first().strip()
desc = [' '.join(item.split()) for item in sel.xpath("//*[@id='feature-bullets']//*[@class='a-list-item']/text()").extract()]
print(f'{product_url}\n{seller}\n{title}\n{rating}\n{price}\n{desc}')

答案 1 :(得分:0)

不要以“。”开头。用于xpath表达式。它是用于现实的xpath表达式。

from operator import methodcaller

if response.css('span.a-list-item::text'):
    item['description'] = filter(bool, map(methodcaller('strip'), response.css('span.a-list-item::text').extract()))
else:
    item['description'] = 'No Description'

答案 2 :(得分:0)

您没有描述的商品恰好缺货,并且与没有描述的情况完全不同。 根据当前示例,当物品缺货时,这些属性将永远不会出现。 :),因此请先检查产品的可用性,然后再选择其属性。