アイテムローダーに2つのアイテムをロードします。これはresponse.metaコマンドでインスタンス化されます。どういうわけか、標準:アイテムローダーがresponse.metaと連携していません
loader.add_xpath('item', 'xpath')
が動作していない(つまり、値が保存されていないか、書かれている、それはアイテムの作成されなかったようである)が、まったく同じ表現を持つ:
response.xpath('xpath)
loader.add_value('item',value)
は機能しますか?誰でも今なぜですか?以下の完全なコード:
Spider.py
def parse(self, response):
for record in response.xpath('//div[@class="box list"]/div[starts-with(@class,"record")]'):
loader = BaseItemLoader(item=BezrealitkyItems(), selector=record)
loader.add_xpath('title','.//div[@class="details"]/h2/a[@href]/text()')
listing_url = record.xpath('.//div[@class="details"]/p[@class="short-url"]/text()').extract_first()
yield scrapy.Request(listing_url, meta={'loader' : loader}, callback=self.parse_listing)
def parse_listing(self, response):
loader = response.meta['loader']
loader.add_value('url', response.url)
loader.add_xpath('lat','//script[contains(.,"recordGps")]',re=r'(?:"lat":)[0-9]+\.[0-9]+')
return loader.load_item()
上記の私はこれをしようとすると、それはしかし働き、動作しません:
lat_coords = response.xpath('//script[contains(.,"recordGps")]/text()').re(r'(?:"lat":)([0-9]+\.[0-9]+)')
loader.add_value('lat', lat_coords)
私item.pyは、特別なことは何もありません:
をclass BezrealitkyItems(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
lat = scrapy.Field()
class BaseItemLoader(ItemLoader):
title_in = MapCompose(lambda v: v.strip(), Join(''), unidecode)
title_out = TakeFirst()
明確にするために、エラーメッセージは表示されません。 'lat'アイテムが作成されておらず、何も掻き出されていないことだけです。他の項目は、parse_listing関数によって追加されたURLを含め、細かく刻まれています。
を本当に素晴らしい答え、たくさん明示的に最初の解析では降伏scrapy.Request部分をコードする方法を記述するための感謝:あなたはしかし、何をすべき
は、負荷とすべてのステップでアイテムを再作成です。働いた! – Svarto