es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No aclarando otros enlaces.

Hola chicos, estoy tratando de extraer ingredientes de un sitio web, pero cuando ejecuto el código en la clave de ingredientes muestra solo un ingrediente y no pasa por los otros ingredientes.
Gracias por su tiempo.

class RecipiesSpider(scrapy.Spider):
    name = 'recipies'
    allowed_domains = ['www.epicurious.com/search?content=recipe']
    start_urls = ['https://www.epicurious.com/search?content=recipe']

    def parse(self, response):
        links = response.xpath("//article[@class='recipe-content-card']/a[2]/@href")
        for link in links:
            yield response.follow(link.get(), callback=self.parse_recipie, dont_filter=True)

    def parse_recipie(self, response):
        the_recipie = {}
        list_to_append_in_dictionary = []

        the_recipie['name'] = response.xpath("//h1[1]/text()").get()
        # Aquí se encuentran los enlaces que contienen los divs de los ingredientes que tienen el mismo nombre de clase
        ingredients = response.xpath("//div[@class='List-XYTyX gPuEKn']/div[@class='BaseWrap-sc-TURhJ BaseText-fFzBQt Description-dSNklj eTiIvU eftAc']")

        for ingredients_of_recipie in ingredients:
            if "ingredients" in the_recipie:
                list_to_append_in_dictionary.append(response.xpath("normalize-space(.//div[@class='BaseWrap-sc-TURhJ BaseText-fFzBQt Description-dSNklj eTiIvU eftAc']/text())").get())

            else:
                list_to_append_in_dictionary.append(response.xpath("normalize-space(.//div[@class='BaseWrap-sc-TURhJ BaseText-fFzBQt Description-dSNklj eTiIvU eftAc']/text())").get()) 
                the_recipie["ingredients"] = list_to_append_in_dictionary

        yield the_recipie

Los resultados son:

{'name': 'Ginger Pudding', 'ingredients': ['100 g (about ¼ cup plus 2 tablespoons) grated ginger', '100 g (about ¼ cup plus 2 tablespoons) grated ginger', '100 g (about ¼ cup plus 2 tablespoons) grated ginger']}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Posible solución:

    Parece que el problema podría estar en el bucle que recorre los ingredientes. Específicamente, el código está añadiendo todos los ingredientes a la misma lista y luego comprobando si la clave “ingredients” ya está en el diccionario. Si lo está, añade la lista a esa clave, de lo contrario, crea la clave y le asigna la lista.

    Sin embargo, la lista no se limpia ni reinicia para cada nueva receta, por lo que todos los ingredientes de todas las recetas se añaden a la misma lista, lo que resulta en ingredientes duplicados y faltantes. Para solucionar esto, podemos mover la creación de la lista dentro del bucle, de modo que se cree una nueva lista para cada receta.

    Aquí tienes una versión actualizada del código con la corrección:

    class RecipiesSpider(scrapy.Spider):
        name = 'recipies'
        allowed_domains = ['www.epicurious.com']
        start_urls = ['https://www.epicurious.com/search?content=recipe']
    
        def parse(self, response):
            links = response.xpath("//article[@class='recipe-content-card']/a[2]/@href")
            for link in links:
                yield response.follow(link.get(), callback=self.parse_recipe, dont_filter=True)
    
        def parse_recipe(self, response):
            the_recipe = {}
            ingredients_list = []
    
            the_recipe['name'] = response.xpath("//h1[1]/text()").get()
            # obtener todos los divs que contienen los ingredientes
            ingredients = response.xpath("//div[@class='List-XYTyX gPuEKn']/div[@class='BaseWrap-sc-TURhJ BaseText-fFzBQt Description-dSNklj eTiIvU eftAc']")
    
            for ingredient in ingredients:
                # extraer el texto de cada div, eliminar los espacios en blanco y añadirlo a la lista
                ingredient_text = ingredient.xpath("normalize-space(./text())").get()
                ingredients_list.append(ingredient_text)
    
            # asignar la lista de ingredientes a la clave solo una vez, fuera del bucle
            the_recipe["ingredients"] = ingredients_list
    
            yield the_recipe
    

    Con este código, cada receta debería tener su propia lista de ingredientes y los ingredientes duplicados deberían desaparecer. ¡Avísame si esto ayuda!

Comments are closed.