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; }); } });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 }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() } }