def parse_item(self, response):

        # we use this to run XPath commands against the HTML in the response
        hxs = HtmlXPathSelector(response)

        # this is the base XPath string for the element that contains the recipe
        # info
        base_path = """//blockquote[@class="recipe hrecipe"]"""

        # the select() method will return a list of HtmlXPathSelector objects.
        # On this site we will almost certainly either get back just one, if
        # any exist on the page
        recipes_scopes = hxs.select(base_path)

        # if we don't find anything, try the alt parser
        if len(recipes_scopes) < 1:
            self.log('calling alternate delishhh.com scraper')
            return self.parse_item_alt1(response)

        name_path = '//meta[@property="og:title"]/@content'
        description_path = '//meta[@property="og:description"]/@content'
        url_path = '//meta[@property="og:url"]/@content'
        image_path = '//meta[@property="og:image"][1]/@content'
        prepTime_path = './/*[@class="preptime"]/text()'
        cookTime_path = './/*[@class="cooktime"]/text()'
        recipeYield_path = './/*[@class="yield"]/text()'
        ingredients_path = './/div[@class="ingredient"]/*'
        datePublished_path = '//meta[@property="article:published_time"]/@content'
        dateModified_path = '//meta[@property="article:modified_time"]/@content'
        # init an empty list
        recipes = []

        # loop through our recipe scopes and extract the recipe data from each
        for r_scope in recipes_scopes:
            # make an empty RecipeItem
            il = RecipeItemLoader(item=RecipeItem())

            il.add_value('source', self.source)

            il.add_value('name', r_scope.select(name_path).extract())
            il.add_value('image', r_scope.select(image_path).extract())
            il.add_value('url', r_scope.select(url_path).extract())
            il.add_value('description', r_scope.select(description_path).extract())

            il.add_value('prepTime', r_scope.select(prepTime_path).extract())
            il.add_value('cookTime', r_scope.select(cookTime_path).extract())
            il.add_value('recipeYield', r_scope.select(recipeYield_path).extract())

            il.add_value('ingredients', r_scope.select(ingredients_path).extract())

            il.add_value('datePublished', r_scope.select(datePublished_path).extract())
            il.add_value('dateModified', r_scope.select(dateModified_path).extract())

            # stick this RecipeItem in the array of recipes we will return
            recipes.append(il.load_item())

        # more processing is done by the openrecipes.pipelines. Look at that
        # file to see transforms that are applied to each RecipeItem
        return recipes
this site is a mess, with LOTS of inconsistencies in formatting. We will
dataset/ETHPy150Open fictivekin/openrecipes/scrapy_proj/openrecipes/spiders/delishhh_spider.py/DelishhhMixin.parse_item