【问题标题】:Scrapy ValueError: url cant be noneScrapy ValueError:网址不能为无
【发布时间】:2020-07-29 17:18:53
【问题描述】:

简介

我必须创建一个蜘蛛,它可以抓取https://www.karton.eu/einwellig-ab-100-mm 的信息以及产品的重量,该产品的重量在将产品链接到自己的页面后可以抓取。

运行我的代码后,我收到以下错误消息:

我已经检查了 url 是否损坏,所以我可以在我的 scrapy shell 中获取它。

使用代码:

import scrapy
from ..items import KartonageItem

class KartonSpider(scrapy.Spider):
    name = "kartons"
    allow_domains = ['karton.eu']
    start_urls = [
        'https://www.karton.eu/einwellig-ab-100-mm'
        ]
    custom_settings = {'FEED_EXPORT_FIELDS': ['SKU', 'Title', 'Link', 'Price', 'Delivery_Status', 'Weight'] } 
    def parse(self, response):
        card = response.xpath('//div[@class="text-center artikelbox"]')

        for a in card:
            items = KartonageItem()
            link = a.xpath('@href')
            items ['SKU'] = a.xpath('.//div[@class="signal_image status-2"]/small/text()').get()
            items ['Title'] = a.xpath('.//div[@class="title"]/a/text()').get()
            items ['Link'] = link.get()
            items ['Price'] = a.xpath('.//div[@class="price_wrapper"]/strong/span/text()').get()
            items ['Delivery_Status'] = a.xpath('.//div[@class="signal_image status-2"]/small/text()').get()
            yield response.follow(url=link.get(),callback=self.parse, meta={'items':items})

    def parse_item(self,response):
        table = response.xpath('//span[@class="staffelpreise-small"]')

        items = KartonageItem()
        items = response.meta['items']
        items['Weight'] = response.xpath('//span[@class="staffelpreise-small"]/text()').get()
        yield items

是什么导致了这个错误?

【问题讨论】:

  • url=link.get() link.get() 最有可能返回 None。在这种情况下,您需要在调用response.follow 之前检查它。
  • 你能详细解释一下吗?我是初学者

标签: python python-3.x xpath scrapy web-crawler


【解决方案1】:

问题是您的link.get() 返回一个None 值。看来问题出在您的 XPath 中。

def parse(self, response):
    card = response.xpath('//div[@class="text-center artikelbox"]')

    for a in card:
        items = KartonageItem()
        link = a.xpath('@href')

虽然card 变量选择了几个div 标记,但该div 的自轴中没有@href(这就是它返回空的原因),但在后代a 标记中有。所以我相信这应该会给你预期的结果:

def parse(self, response):
    card = response.xpath('//div[@class="text-center artikelbox"]')

    for a in card:
        items = KartonageItem()
        link = a.xpath('a/@href') # FIX HERE <<<<<

【讨论】:

  • 谢谢,这帮助了我。现在我在控制台中没有收到任何错误消息,但也没有在我的 csv 中存储任何信息,我犯了什么重大错误吗? P.S:我发现我的错误,在第 22 行,我忘了在 item 中存储数据
  • 很高兴知道您解决了问题。由于答案解决了相关问题,请点击复选标记接受。
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多