class Job(Item):
a_title = Field()
b_url = Field()
c_date = Field()
d_pub = Field()
class stage(Spider):
name = 'jobs'
start_urls = ['http://www.stagiaire.com/offres-stages.html/']
def parse(self, response):
for i in response.css('.info-offre'):
title = i.css('.titleads::text').extract()
url = i.css('.titleads::attr(href)').extract()
date = i.css('.date-offre.tip::text').extract()
pub = i.css('.content-1+ .content-1 .date-offre::text').extract()
yield Job(a_title=title, b_url=url, c_date=date, d_pub=pub)
答案 0 :(得分:1)
由于您没有使用scrapy ItemLoader,因此您可以将具体列表添加到您可能期望单个元素的结果中。要解决此问题,请使用extract_first()
而不是extract()
来仅获取第一个xpath选择。
在你的情况下应该是:
title = i.css('.titleads::text').extract_first('') # defaults to ''
url = i.css('.titleads::attr(href)').extract_first('').strip() # get rid of spaces and /n etc.
date = i.css('.date-offre.tip::text').extract_first('')
pub = i.css('.content-1+ .content-1 .date-offre::text').extract_first('')
实际上你似乎想在这里使用ItemLoader来清理换行符的所有字段等。
from scrapy.loader import ItemLoader
from scrapy import Item, Field
from scrapy.loader.processors import Compose, TakeFirst
class MyItem(scrapy.Item):
title = Field()
class MyItemLoader(ItemLoader):
default_item_class = MyItem
# this will process every field in the item, take first element and remove all newlines and trailing spaces
default_output_processor = Compose(TakeFirst(),
lambda v: v.replace('\n','').strip()) # get rid of new lines
这可能看起来很多,但是项目加载器只是项目对象的包装器,当你在其中放入一个值或将其取出时,它会执行某些操作。在上面的示例中,它将处理所有值,如果它是列表,则取第一个元素并删除任何换行符。
然后只需创建加载器并在某些字段中加载!
loader = MyItemLoader(selector=response)
loader.add_css('title', '.titleads::text')
loader.add_css('url', '.titleads::attr(href)')
loader.add_css('date', '.date-offre.tip::text')
loader.add_css('pub', '.content-1+ .content-1 .date-offre::text')
return loader.load_item()