Estoy tratando de usar grep and cut para extraer URL de un archivo HTML. Los enlaces se ven así:
<a href="http://examplewebsite.com/">
Otros sitios web lo han hecho .net, .govpero supongo que podría hacer el punto de corte justo antes >. Así que sé que puedo usar grep y cut de alguna manera para cortar todo antes de http y después de .com, pero me he quedado atascado por un tiempo.
shell-script
grep
string
cut
eltigre
fuente
fuente

<>obliga a que se vea como una etiqueta HTML.Respuestas:
Como dije en mi comentario, generalmente no es una buena idea analizar HTML con expresiones regulares, pero a veces puedes salirte con la tuya si el HTML que estás analizando se comporta bien.
Para obtener solo las URL que están en el
hrefatributo 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:donde
source.htmlestá el archivo que contiene el código HTML para analizar.Este código imprimirá todas las URL de nivel superior que ocurran como el
hrefatributo de cualquier<a>elemento en cada línea. La-iopción para el primergrepcomando es asegurarse de que funcione tanto en elementos<a>como en<A>elementos. Supongo que también podría dar-ial segundogreppara capturarHREFatributos en mayúsculas , OTOH, preferiría ignorar ese HTML roto. :)Para procesar los contenidos de
http://google.com/salida
Mi salida es un poco diferente de los otros ejemplos a medida que me redirigen a la página australiana de Google.
fuente
://solo aceptamos caracteres antes del primero/o". Pero si desea ver la URL completa, cambie ese comando agrep -Eo '(http|https)://[^"]+. Otra opción para esa línea es lagrep -Eo '(http|https)://[^?"]+'que corta las opciones de consulta. Sin embargo, esa variación aún imprimirá las URL que están contenidas dentro de otra URL como parámetro de consulta, pero se imprimirán en una línea separada.No estoy seguro si está limitado en herramientas:
Pero la expresión regular puede no ser la mejor manera de hacerlo, como se mencionó, pero aquí hay un ejemplo que preparé:
Salida:
También puede agregar
\dpara capturar otros tipos de números.fuente
sort -u?Si su grep admite expresiones regulares de Perl:
(?<=href=")y(?=")son expresiones de búsqueda para elhrefatributo. Esto necesita la-Popción.-oImprime el texto correspondiente.Por ejemplo:
Como de costumbre, no hay garantía de que estos sean URI válidos, o que el HTML que está analizando sea válido.
fuente
Como alternativa no regex , use pup :
Encontrará todos los
aelementos que tienen unhrefatributo, luego mostrará el valor delhrefatributo.Para instalar
pup, necesita Go (un lenguaje de programación):La ventaja de esta solución es que no se basa en el formato HTML correcto .
fuente
pup, hora de instalar eso ...pup 'a.classname[href] attr{href}' < tut.html >links.mdHe encontrado una solución aquí que es en mi humilde opinión mucho más simple y potencialmente más rápido de lo que se propuso aquí. Me he ajustado un poco para admitir archivos https. Pero la versión TD; TR es ...
PD: puede reemplazar la URL del sitio con una ruta a un archivo y funcionará de la misma manera.
Si solo desea ver los enlaces en lugar de colocarlos en un archivo, intente esto en su lugar ...
El resultado será similar al siguiente ...
Para mi caso de uso, esto funcionó bien. Pero tenga cuidado con el hecho de que hoy en día, las personas agregan enlaces como src = "// blah.tld" para URI CDN de bibliotecas. No quería verlos en los enlaces recuperados.
No es necesario intentar buscar href u otras fuentes de enlaces porque "lynx -dump" extraerá de forma predeterminada todos los enlaces en los que se puede hacer clic desde una página determinada. Entonces, lo único que debe hacer después de eso es analizar el resultado de "lynx -dump" usando grep para obtener una versión en bruto más limpia del mismo resultado.
fuente
... probablemente lo haría bastante bien. Tal como está escrito, imprime:
Si es importante que solo coincida con enlaces y entre esos dominios de nivel superior, puede hacer lo siguiente:
... o algo así, aunque para algunos
seds, es posible que deba sustituir un carácter literal de línea de línea\nelectrónica para cada uno de los últimos dosns.Tal como está escrito, el comando anterior imprime:
... y para cualquier caso (pero probablemente lo más útil con este último) puede agregar un
|sort -ufiltro hasta el final para obtener la listasorteditada y soltar duplicados.fuente
Más corto
fuente
fuente