代码之家  ›  专栏  ›  技术社区  ›  Grevioos

处理时出现刮键错误

  •  1
  • Grevioos  · 技术社区  · 7 年前

    我找不到任何问题的答案,所以我希望可以在这里提问。

    我正在尝试取消电影节目,但仍然出现以下错误。

    enter image description here

    真正让我困惑的是,问题显然在于管道。然而,我有第二个歌剧院蜘蛛,代码完全相同(只是位置不同),它工作得很好。“Shows”和“Place”指的是我的Django模型。我已将它们的字段更改为CharFields,因此日期/时间格式不存在问题。

    我还尝试使用专用的刮擦项目“KikaItem”而不是“ShowItem”(与我的opera spider共享),但错误仍然存在。

    class ScrapyKika(object):
        def process_item(self, ShowItem, spider):
            place, created = Place.objects.get_or_create(name="kino kika")
    
            show = Shows.objects.update_or_create(
                time=ShowItem["time"],
                date=ShowItem["date"],
                place=place,
                defaults={'title': ShowItem["title"]}
            )
    
            return ShowItem
    

    这是我的蜘蛛代码。我想问题就在这里,因为我在这里使用了与歌剧不同的方法。然而,我不确定会出什么问题。

    import scrapy
    from ..items import ShowItem, KikaItemLoader
    
    class KikaSpider(scrapy.Spider):
        name = "kika"
        allowed_domains = ["http://www.kinokika.pl/dk.php"]
        start_urls = [
            "http://www.kinokika.pl/dk.php"
    
    
        ]
        def parse(self, response):
            divs = response.xpath('//b')
            for div in divs:
                l = KikaItemLoader(item=ShowItem(), response=response)
                l.add_xpath("title", "./text()")
                l.add_xpath("date", "./ancestor::ul[1]/preceding-sibling::h2[1]/text()")
                l.add_xpath("time", "./preceding-sibling::small[1]/text()")
                return l.load_item()
    

    项目加载器

    class KikaItemLoader(ItemLoader):
        title_in = MapCompose(strip_string,lowercase)
        title_out = Join()
    
        time_in = MapCompose(strip_string)
        time_out = Join()
    
        date_in = MapCompose(strip_string)
        date_out = Join()
    

    感谢您抽出时间,并对所有拼写错误表示抱歉:)

    1 回复  |  直到 7 年前
        1
  •  2
  •   alecxe    7 年前

    目前,您的spider只生成一个项目:

    {'title': u'  '}
    

    没有 date time 填写的字段。这是因为您初始化 ItemLoader 在你的蜘蛛类。

    您应该使用特定的选择器初始化项目加载器。替换:

    for div in divs:
        l = KikaItemLoader(item=ShowItem(), response=response)
    

    使用:

    for div in divs:
        l = KikaItemLoader(item=ShowItem(), selector=div)