Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

194
Vistas
¿Cuál es el enfoque correcto para hacer un bucle For con un objeto Cheerio?

En pocas palabras, estoy extrayendo datos de un sitio web y almacenándolos en una base de datos.

Los campos relevantes son enlaces, nombres, precios y estado del artículo.

La forma en que estoy manejando esto en este momento es iterar a través de cada Elemento y empujarlos a sus respectivas listas. Luego agregándolo a una base de datos con un For Loop. Así por ejemplo:

 var names= []; $(".midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2 .valtitle.lovewrap.padr4 .underlinedlinks").each(function(){ names.push($(this).text()); }); ... for (x in names){ var sql = "REPLACE INTO `item` (`link`, `title`, `price`, `date`, `item_condition`, `country`) VALUES (?)"; var values = [links[x], names[x], prices[x], '', states[x], cc]; con.query(sql, [values], function(err, result){ if (err) throw err; }); }

Esto es muy ingenuo, ya que espera que existan todos los Elementos y que se alineen perfectamente, lo que funcionó bien hasta ahora, hasta que noté que algunos listados en el sitio web que estoy raspando no tienen un elemento Condición del artículo, por lo que se omite y las listas se desincronizan, lo que da como resultado que se emparejen los valores incorrectos.

Entiendo que la respuesta que estoy buscando tiene que ver con la función .each, pero no estoy exactamente seguro de cómo hacerlo. Supongo que tengo que ir al punto más alto, que es .midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2 e ir desde allí. Agregar un valor NULL si no encuentra un Elemento.

A continuación se muestra el código completo (relevante):

 const $ = c.load(response.data); $(".midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2 .splittable .splittablecell1 .padr2.bhserp-txt1.bhserp-new1").each(function(){ var fixedStr = $(this).text().replace(/,|£|\$|\s|[(GBP)]|[(USD)]/g, ''); prices.push(Number(fixedStr)); }); $(".midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2 .valtitle.lovewrap.padr4 .underlinedlinks").each(function(){ names.push($(this).text()); }); $(".midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2 .splittable .splittablecell1.bhserp-txt1 .padl1.labinfo").each(function(){ if ($(this)){ states.push($(this).text()); } else{ console.log("Mistake here, pick me up!"); // I understand what I'm doing here does not make sense and is wrong as I've stated, but since that's what made me realize what I needed to do, I'm leaving it. states.push("None"); } }); $(".midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2 .valtitle.lovewrap.padr4 .underlinedlinks").each(function(){ var tempLink = $(this).attr('href'); var fixedLinks = tempLink.split("="); var fixedLinks = fixedLinks[1].split("&"); links.push("https://www.ebay.co.uk/itm/" + fixedLinks[0]); }); ... con.connect(function(err){ if (err) throw err; console.log("Connected!"); for (x in names){ var sql = "REPLACE INTO `item` (`link`, `title`, `price`, `date`, `item_condition`, `country`) VALUES (?)"; var values = [links[x], names[x], prices[x], '', states[x], cc]; con.query(sql, [values], function(err, result){ if (err) throw err; }); } });
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Debe iterar los elementos. Si intenta obtener los precios por separado de los enlaces, tendrá una mala experiencia. Algo como:

 for(let div of $('.product').get()){ let item = { link: $(div).find('a').attr('href') price: $(div).find('.price').text(), } // insert item into the db }
over 4 years ago · Santiago Trujillo Denunciar

0

La respuesta de pguardiario funcionó perfectamente, dejaré aquí el código con el que terminé para futuras referencias:

 for(let div of $('.midbox .framebox .frameboxcells .displaybox .displayboxbottom .dt.bg0 .serptablecell2-adv .serptablebasestyle2').get()){ var tempLink = $(div).find('.underlinedlinks').attr('href'); var fixedLinks = tempLink.split("="); var fixedLinks = fixedLinks[1].split("&"); var fixedStr = $(div).find('.padr2.bhserp-txt1.bhserp-new1').text().replace(/,|£|\$|\s|[(GBP)]|[(USD)]/g, ''); let item = { link: "https://www.ebay.co.uk/itm/" + fixedLinks[0], name: $(div).find('.valtitle.lovewrap.padr4 .underlinedlinks').text(), price: Number(fixedStr), condition: $(div).find('.padl1.labinfo').text() } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda