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']}
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:
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!