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
, .gov
pero 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
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:donde
source.html
está el archivo que contiene el código HTML para analizar.Este código imprimirá todas las URL de nivel superior que ocurran como el
href
atributo de cualquier<a>
elemento en cada línea. La-i
opción para el primergrep
comando es asegurarse de que funcione tanto en elementos<a>
como en<A>
elementos. Supongo que también podría dar-i
al segundogrep
para capturarHREF
atributos 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
\d
para 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 elhref
atributo. Esto necesita la-P
opción.-o
Imprime 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
a
elementos que tienen unhref
atributo, luego mostrará el valor delhref
atributo.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.md
He 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
sed
s, es posible que deba sustituir un carácter literal de línea de línea\n
electrónica para cada uno de los últimos dosn
s.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 -u
filtro hasta el final para obtener la listasort
editada y soltar duplicados.fuente
Más corto
fuente
fuente