• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

94
Vistas
cómo manejar la comparación de cadenas y la escritura de archivos usando xlsx con nodejs

Este script es para obtener el título de la página web donde se pasará la URL del sitio web desde un archivo de Excel, verificar si el título contiene la palabra clave y luego almacenar ese dominio en el nuevo archivo de Excel.

No hay problema con el código parcial, pero la comparación de títulos no funciona como se esperaba. ¿Alguien tiene una idea de cómo solucionarlo?

aquí está mi código

 var request = require("request"); var cheerio = require("cheerio"); const xlsx = require("xlsx"); jsonData = [{ Domain: "blogger.com" }, { Domain: "stackoverflow.com" }]; function fetchTitle(url, onComplete = null) { request(url, function (error, response, body) { var output = url; // default to URL if (!error && (response && response.statusCode) === 200) { var $ = cheerio.load(body); console.log(`URL = ${url}`); var title = $("head > title").text().trim(); console.log(`Title = ${title}`); output = `[${title}] (${url})`; var keywords = ["Developers", "blog"]; var results = []; var UrlArray = []; for (var i = 0; i < keywords.length; i++) { var match = title.match(new RegExp(keywords.join("|"), "g")); results.push(keywords[i]); } if (match.length > 0) { UrlArray.push({ Domain: url, Keywords: results, Title: output, }); finalJsonData = JSON.stringify(UrlArray); const ws = xlsx.utils.json_to_sheet(UrlArray); const wb = xlsx.utils.book_new(); xlsx.utils.book_append_sheet(wb, ws, "Responses"); xlsx.writeFile(wb, "output.xlsx"); } } else { console.log( `Error = ${error}, code = ${response && response.statusCode}` ); } console.log(`output = ${output} \n\n`); if (onComplete) onComplete(output); }); } jsonData.forEach(function (table) { var tableName = table.Domain; var URL = "http://" + tableName; fetchTitle(URL); });

Cuando ejecuto el script, puedo obtener el título, pero cuando lo comparo con la palabra clave, no funciona como se esperaba. Las palabras clave no se almacenan. Puede ver cómo se ve la salida después de ejecutar el script.

captura de pantalla de Excel de salida

La secuencia de comandos muestra que ambos dominios tienen palabras clave, pero solo Blogger está almacenado en la hoja de cálculo, aunque las palabras clave no se almacenan.

almost 3 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

  1. estás sobrescribiendo el archivo en cada ciclo,
  2. keywords es una matriz, por lo que no se guarda, además, la columna de palabras clave siempre contendrá todas las palabras clave, no las que coinciden...

como las solicitudes son asíncronas, debe realizar un seguimiento de todas ellas y escribir los resultados solo cuando todas las solicitudes hayan finalizado.

prueba esto:

  • haga coincidir mayúsculas y minúsculas y almacene solo palabras clave coincidentes para ese sitio, no todas (también agregué "sin coincidencia" para dominios sin coincidencia)
  • almacenar resultados fuera del ciclo
  • mover los resultados de escritura a una función separada
  • agregar contador de solicitudes y devolución de llamada para rastrear solicitudes
  • escribir los resultados cuando se realizan las solicitudes

el código:

 var request = require("request"); var cheerio = require("cheerio"); const xlsx = require("xlsx"); const jsonData = [{ Domain: "blogger.com" }, { Domain: "stackoverflow.com" }]; var UrlArray = []; function writeResults() { const finalJsonData = JSON.stringify(UrlArray); const ws = xlsx.utils.json_to_sheet(UrlArray); const wb = xlsx.utils.book_new(); xlsx.utils.book_append_sheet(wb, ws, "Responses"); xlsx.writeFile(wb, "output.xlsx"); } function fetchTitle(url, onComplete = null) { request(url, function (error, response, body) { var output = url; // default to URL if (!error && (response && response.statusCode) === 200) { var $ = cheerio.load(body); console.log(`URL = ${url}`); var title = $("head > title").text().trim(); console.log(`Title = ${title}`); output = `[${title}] (${url})`; var keywords = ["Developers", "blog"]; var results = []; for (var i = 0; i < keywords.length; i++) { let match = title.match(new RegExp(keywords[i], "gi")); if (match && match.length > 0) { results.push(keywords[i]); } } UrlArray.push({ Domain: url, Keywords: results.length > 0 ? results.join(', ') : 'no match', Title: output, }); } else { console.log( `Error = ${error}, code = ${response && response.statusCode}` ); } console.log(`output = ${output} \n\n`); if (onComplete) onComplete(output); }); } let counter = 0; jsonData.forEach(function (table) { var tableName = table.Domain; var URL = "http://" + tableName; fetchTitle(URL, ()=>{ counter++; if(counter === jsonData.length) { console.log(`all ${counter} requests done`); writeResults(); } }); });
almost 3 years ago · Juan Pablo Isaza 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 Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda