ejemplos - La forma más sencilla de extraer las URL de una página html utilizando solo sed o awk
sed regex online (13)
Quiero extraer la URL dentro de las etiquetas de anclaje de un archivo html. Esto debe hacerse en BASH usando SED / AWK. No perl por favor
¿Cuál es la forma más fácil de hacer esto?
Ampliando la respuesta de kerkael :
grep "<a href=" sourcepage.html
|sed "s/<a href///n<a href/g"
|sed ''s//"//"><//a>/n/2''
|grep href
|sort |uniq
# now adding some more
|grep -v "<a href=/"#"
|grep -v "<a href=/"../"
|grep -v "<a href=/"http"
La primera grep que agregué elimina los enlaces a marcadores locales.
El segundo elimina enlaces relativos a niveles superiores.
El tercero elimina enlaces que no comienzan con http.
Elija y elija cuál de estos usa según sus requisitos específicos.
Así es como lo intenté para una mejor visión, crear un archivo de shell y dar un enlace como parámetro, creará el archivo temp2.txt.
a=$1
lynx -listonly -dump "$a" > temp
awk ''FNR > 2 {print$2}'' temp > temp2.txt
rm temp
>sh test.sh http://link.com
Con la herramienta de extracción de datos HTML / XML Xidel , esto se puede hacer a través de:
$ xidel --extract "//a/@href" http://example.com/
Con la conversión a URL absolutas:
$ xidel --extract "//a/resolve-uri(@href, base-uri())" http://example.com/
Esta es mi primera publicación, así que trato de hacer mi mejor esfuerzo explicando por qué publico esta respuesta ...
- Desde las primeras 7 respuestas más votadas, 4 incluyen GREP incluso cuando la publicación dice explícitamente "usar sed o awk solamente".
- Incluso cuando la publicación requiere "No perl por favor", debido al punto anterior, y porque usa PERL regex dentro de grep.
- y porque esta es la manera más simple (hasta donde sé, y se requería) para hacerlo en BASH.
Así que aquí viene el script más simple de GNU grep 2.28:
grep -Po ''href="/K.*?(?=")''
Acerca del /K
, no se ha encontrado información en las páginas MAN e INFO, así que vine here para obtener la respuesta ... el /K
elimina los caracteres anteriores (y la clave misma). Tenga en cuenta que sigue los consejos de las páginas del manual: "Esto es muy experimental y grep -P puede advertir sobre las características no implementadas".
Por supuesto, puede modificar la secuencia de comandos para satisfacer sus gustos o necesidades, pero me pareció bastante directo para lo que se solicitó en la publicación, y también para muchos de nosotros ...
Espero que la gente lo encuentre muy útil.
¡¡¡Gracias!!!
Hice algunos cambios a Greg Bacon Solution
cat index.html | grep -o ''<a .*href=.*>'' | sed -e ''s/<a //n<a /g'' | sed -e ''s/<a .*href=[''"''"''"]//'' -e ''s/["''"''"''].*$//'' -e ''/^$/ d''
Esto soluciona dos problemas:
- Estamos coincidiendo casos en que el ancla no comienza con href como primer atributo
- Estamos cubriendo la posibilidad de tener varios anclajes en la misma línea
Puedes hacerlo bastante fácilmente con la siguiente expresión regular, que es bastante buena para encontrar URL:
/b(([/w-]+://?|www[.])[^/s()<>]+(?:/([/w/d]+/)|([^[:punct:]/s]|/)))
Lo tomé del artículo de John Gruber sobre cómo encontrar las URL en el texto .
Eso le permite encontrar todas las URL en un archivo f.html de la siguiente manera:
cat f.html | grep -o /
-E ''/b(([/w-]+://?|www[.])[^/s()<>]+(?:/([/w/d]+/)|([^[:punct:]/s]|/)))''
Puedes probar:
curl --silent -u "<username>:<password>" http://<NAGIOS_HOST/nagios/cgi-bin/status.cgi|grep ''extinfo.cgi?type=1&host=''|grep "status"|awk -F''</A>'' ''{print $1}''|awk -F"''>" ''{print $3"/t"$1}''|sed ''s/<//a> <//td>//g''| column -c2 -t|awk ''{print $1}''
Supongo que quiere extraer una URL de un texto HTML y no analizar HTML (como sugiere uno de los comentarios). Lo creas o no, alguien ya ha hecho esto .
OT: El sitio web sed tiene mucha información buena y muchos scripts sed interesantes / locos. ¡Incluso puedes play Sokoban en Sed!
Tú lo pediste:
$ wget -O - http://.com | /
grep -o ''<a href=[''"''"''"][^"''"''"'']*[''"''"''"]'' | /
sed -e ''s/^<a href=["''"''"'']//'' -e ''s/["''"''"'']$//''
Esta es una herramienta cruda, por lo que se aplican todas las advertencias habituales sobre el intento de analizar HTML con expresiones regulares.
También podría hacer algo como esto (siempre que tenga instalado lince) ...
Versiones de Lynx <2.8.8
lynx -dump -listonly my.html
Versiones de Lynx> = 2.8.8 (cortesía de @condit)
lynx -dump -hiddenlinks=listonly my.html
Un ejemplo, ya que no proporcionó ninguna muestra
awk ''BEGIN{
RS="</a>"
IGNORECASE=1
}
{
for(o=1;o<=NF;o++){
if ( $o ~ /href/){
gsub(/.*href=/042/,"",$o)
gsub(//042.*/,"",$o)
print $(o)
}
}
}'' index.html
Vaya con un primer paso reemplazando el inicio de las URL (http) con una nueva línea ( /n
http). Luego, tiene garantizado que su enlace comienza al principio de la línea y es la única URL en la línea.
El resto debería ser fácil, aquí hay un ejemplo:
sed "s/http//nhttp/g" <(curl "http://www.cnn.com") | sed -n "s//(^http[s]*:[a-Z0-9/.=?_-]*/)/(.*/)//1/p"
alias lsurls=''_(){ sed "s/http//nhttp/g" "${1}" | sed -n "s//(^http[s]*:[a-Z0-9/.=?_-]*/)/(.*/)//1/p"; }; _''
grep "<a href=" sourcepage.html
|sed "s/<a href///n<a href/g"
|sed ''s//"//"><//a>/n/2''
|grep href
|sort |uniq
- El primer grep busca líneas que contengan urls. Puede agregar más elementos después si desea buscar solo en las páginas locales, por lo que no hay http, pero la ruta relativa.
- El primer sed agregará una nueva línea al frente de cada una de las etiquetas href url con el / n
- El segundo sed acortará cada url después del 2 ° "en la línea al reemplazarlo con la etiqueta / a con una nueva línea. Ambos seds le darán cada url en una sola línea, pero hay basura, por lo que
- El 2nd grep href limpia el desorden
- El género y uniq le darán una instancia de cada URL existente presente en sourcepage.html