Scrapy ValueError: url cant be none
Scrapy ValueError: url cant be none
简介
我必须创建一个蜘蛛来抓取 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
导致此错误的原因是什么?
问题是您的 link.get()
returns 一个 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
(这就是为什么它 returns空),但在后代 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 <<<<<
简介
我必须创建一个蜘蛛来抓取 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
导致此错误的原因是什么?
问题是您的 link.get()
returns 一个 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
(这就是为什么它 returns空),但在后代 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 <<<<<