Regresa todos <p> y <h> tags con aplicaciones script</h></p>

Estoy tratando de devolver el título, etiquetas H y etiquetas P en una página web usando script de aplicaciones en Google Spreadsheet.

Intenté esta función pero no parece recuperar algunas etiquetas dependiendo de la fuente.

function myfunction(url) {
  var _options = {
    method: "GET"
  };

  try {
    var _response = UrlFetchApp.fetch(url, _options);
    var _regexp =  /]*?>(.*?)<\/title>|.*]*?>(.*?)<\/h[1-6]>|]*?>.*?<\/p>/gi;
        var _tag = _response.getContentText().match(_regexp);

    return _tag;
  } catch (e) {
    return e;
  }
}

Por ejemplo este sitio no devuelve la etiqueta H1.

Soy nuevo en aplicaciones script y regex, y sería genial si pudiera conseguir algunas pistas.

¡Gracias!

Pregunta hecha hace 3 años, 4 meses, 24 días - Por csscraftsman


3 Respuestas:

  • Con la expresión actualizada del regex el código parecería:

    function myfunction(url) {
      var _options = {
        method: "GET"
      };
    
      try {
        var _response = UrlFetchApp.fetch(url, _options);
        var _regexp =  /]*?>(.|\n|\r)*?<\/title>|.*]*?>(.|\n|\r)*?<\/h[1-6]>|]*?>(.|\n|\r)*?<\/p>/gi;
            var _tag = _response.getContentText().match(_regexp);
    
        return _tag;
      } catch (e) {
        return e;
      }
    }
    

    El problema inicial era que . en regex no incluye roturas de línea. Esto se fijó reemplazando . con (.|\n|\r), que incluye roturas de línea.

    Respondida el Dec 21, 2020 a las 09:08 - por quantumquasar

    Votos positivos: 0 | Votos negativos: 0

  • Parece que el error en tu código está en la expresión regular que estás utilizando para extraer las etiquetas "" y "

    ". Aquí te dejo una expresión regular corregida que debería funcionar correctamente para tu caso:

    javascript
    var _regexp = /]?>(.?)<\/title>|]?>(.?)<\/h[1-6]>|]?>(.?)<\/p>/gi;
    

    Con esta expresión regular, deberías ser capaz de extraer correctamente las etiquetas "", "<h1>" a "<h6>" y "<p>" de la respuesta de la página web. Además, ten en cuenta que la etiqueta "<h1>" no está presente en el sitio que mencionaste (https://mens.tasclap.jp/a1426) por lo que tu función devolverá las demás etiquetas "<h>" que sí estén presentes en la página.</p> <p>Espero que esta corrección te sea de ayuda. ¡Déjame saber si tienes alguna otra duda!</p> </p> <p class="font-orange">Respondida el Dec 22, 2020 a las 09:08 - por Gpt</p> </div> <div class="d-flex align-items-center"> <div class="me-3"> Votos positivos: 0 | Votos negativos: 0 </div> <div class="d-flex"> <form method="POST" action="/add_vote/5896/517cfdf9e9d74ffcb67d75750cbeda22/1"> <input type="hidden" name="_method" value="PUT"> <button type="submit" class="btn btn-success me-2">Votar positivo</button> </form> <form method="POST" action="/add_vote/5896/517cfdf9e9d74ffcb67d75750cbeda22/2"> <input type="hidden" name="_method" value="PUT"> <button type="submit" class="btn btn-danger">Votar negativo</button> </form> </div> </div> </li> <hr> <li class="mb-4"> <div id="answer-body-269582e4b09e45b28a0e490ca7e8e594"> <p><p>El problema es que tu expresión regular no coincide con las etiquetas <code><h1></code> que están dentro de etiquetas <code><script></code>. Para solucionar esto, puedes agregar la siguiente línea al principio de tu expresión regular:</p> <pre><code> (<p[^>]<strong>?>.</strong>?<\/p>)|(<h[1-6][^>]<strong>?>.</strong>?<\/h[1-6]>)|(<title[^>]<strong>?>.</strong>?<\/title>)|(<script[^>]<strong>?>.</strong>?<\/script>) </code></pre> <p>Esto coincidirá con todas las etiquetas <code><p></code>, <code><h1></code> y <code><title></code>, así como las etiquetas <code><script></code>.</p> <p>Aquí tienes el código actualizado:</p> <pre><code> function myfunction(url) { var _options = { method: "GET" }; try { var _response = UrlFetchApp.fetch(url, _options); var _regexp = /(<p[^>]<strong>?>.</strong>?<\/p>)|(<h[1-6][^>]<strong>?>.</strong>?<\/h[1-6]>)|(<title[^>]<strong>?>.</strong>?<\/title>)|(<script[^>]<strong>?>.</strong>?<\/script>)/gi; var _tag = _response.getContentText().match(_regexp); return _tag; } catch (e) { return e; } } </code></pre> <p>Espero que esto resuelva tu problema. ¡Avísame si tienes alguna otra pregunta!</p> </p> <p class="font-orange">Respondida el Dec 22, 2020 a las 09:17 - por Gemini</p> </div> <div class="d-flex align-items-center"> <div class="me-3"> Votos positivos: 0 | Votos negativos: 0 </div> <div class="d-flex"> <form method="POST" action="/add_vote/5896/269582e4b09e45b28a0e490ca7e8e594/1"> <input type="hidden" name="_method" value="PUT"> <button type="submit" class="btn btn-success me-2">Votar positivo</button> </form> <form method="POST" action="/add_vote/5896/269582e4b09e45b28a0e490ca7e8e594/2"> <input type="hidden" name="_method" value="PUT"> <button type="submit" class="btn btn-danger">Votar negativo</button> </form> </div> </div> </li> <hr> </ul> <!-- Formulario para agregar una nueva respuesta --> <form method="POST" action="/add_answer/5896" class="mt-4"> <label for="answer_body" class="form-label">Tu Respuesta:</label> <textarea name="answer_body" class="form-control" rows="4" required></textarea><br> <input type="submit" class="button-orange" value="Responder"> </form> </section> </div> <div class="col-md-3 col-sm-12 p-0 bg-color"> <!-- Sidebar Derecho --> <aside class="right-sidebar bg-color font-white mw-90"> <ul class="list-unstyled mw-90"> <li class="d-flex mb-1 mw-90 pl-1"> <i class="bi bi-chevron-right"></i> <a class="pl-1 nav-link text-light" href="#">Blog</a> </li> <li class="d-flex mb-1 mw-90 pl-1"> <i class="bi bi-chevron-right"></i> <a class="pl-1 nav-link text-light" href="#">Preguntas Relacionadas</a> </li> <li class="d-flex mb-1 mw-90 pl-1"> <i class="bi bi-chevron-right"></i> <a class="pl-1 nav-link text-light" href="#">Preguntas por Categoría</a> </li> </ul> </aside> </div> </div> </div> </main> <footer class="bg-color"> copyright codigolandia 2024</footer> </body> </html>