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 elhref
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.