当我的数据导入csv时,我的输出可能因为制表符和空格而无序

时间:2016-08-23 13:49:45

标签: python web-scraping scrapy

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)

this my output

1 个答案:

答案 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()