Saltar al contenido

Cómo utilizar grep y cortar en script para obtener las URL de un sitio web a partir de un archivo HTML

Solución:

Como dije en mi comentario, generalmente no es una buena idea analizar HTML con expresiones regulares, pero a veces puede salirse con la suya si el HTML que está analizando se comporta bien.

Para obtener solo las URL que están en el href atributo de <a> elementos, me resulta más fácil hacerlo en varias etapas. Según sus comentarios, parece que solo desea el dominio de nivel superior, no la URL completa. En ese caso, puede usar algo como esto:

grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="https://foroayuda.es/[^"]+"' | 
grep -Eo '(http|https)://[^/"]+'

dónde source.html es el archivo que contiene el código HTML para analizar.

Este código imprimirá todas las URL de nivel superior que aparecen como href atributo de cualquier <a> elementos en cada línea. los -i opción a la primera grep comando es asegurarse de que funcionará en ambos <a> y <A> elementos. Supongo que también podrías dar -i al 2do grep para capturar mayúsculas HREF atributos, OTOH, preferiría ignorar ese HTML roto. 🙂

Para procesar el contenido de http://google.com/

wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' | 
grep -Eo 'href="https://foroayuda.es/[^"]+"' | 
grep -Eo '(http|https)://[^/"]+'

producción

http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au

Mi resultado es un poco diferente de los otros ejemplos, ya que me redirigen a la página australiana de Google.

No estoy seguro si tiene limitaciones de herramientas:

Pero la expresión regular puede no ser la mejor manera de hacerlo como se mencionó, pero aquí hay un ejemplo que reuní:

cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | sort -u
  • grep -E : es lo mismo que egrep
  • grep -o : solo da salida a lo que ha sido grepped
  • (http|https) : es una u otra
  • a-z : es todo en minúsculas
  • A-Z : es todo en mayúsculas
  • . : es un punto
  • / : es la barra
  • ? : es ?
  • = : es signo igual
  • _ : es subrayado
  • % : es un signo de porcentaje
  • : : es dos puntos
  • - : es guión
  • *: es repetir el […] grupo
  • sort -u : clasificará y eliminará los duplicados

Producción:

[email protected]:~s$  wget -qO- https://stackoverflow.com/ | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
https://stackauth.com
https://meta.stackoverflow.com
https://cdn.sstatic.net/Img/svg-icons
https://stackoverflow.com
https://www.stackoverflowbusiness.com/talent
https://www.stackoverflowbusiness.com/advertising
https://stackoverflow.com/users/login?ssrc=head
https://stackoverflow.com/users/signup?ssrc=head
https://stackoverflow.com
https://stackoverflow.com/help
https://chat.stackoverflow.com
https://meta.stackoverflow.com
...

También puede agregar d para captar otros tipos de números.

Si su grep admite expresiones regulares de Perl:

grep -Po '(?<=href="https://foroayuda.es/)[^"]*(?=")'
  • (?<=href="https://foroayuda.es/) y (?=") son expresiones de búsqueda para el href atributo. Esto necesita el -P opción.
  • -o imprime el texto correspondiente.

Por ejemplo:

$ curl -sL https://www.google.com | grep -Po '(?<=href="https://foroayuda.es/)[^"]*(?=")'
/search?
https://www.google.co.in/imghp?hl=en&tab=wi
https://maps.google.co.in/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?gl=IN&tab=w1
https://news.google.co.in/nwshp?hl=en&tab=wn
...

Como de costumbre, no hay garantía de que estos sean URI válidos o de que el HTML que está analizando sea válido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *