Quiero extraer la URL desde dentro de las etiquetas de anclaje de un archivo html.
Esto necesita ser hecho en BASH usando SED/AWK. No perl por favor.

¿Cuál es la manera más fácil de hacer esto?

  • Leer esta y ser iluminados: stackoverflow.com/questions/1732348/…
  • Si no te importa que: no Hay ninguna garantía de que usted encuentre todas las url. o no Hay ninguna garantía de que todas las url que encuentra son válidos. utilice uno de los siguientes ejemplos. Si la mente el uso de una herramienta adecuada para el trabajo (perl, python, ruby)
  • Mi comentario anterior es, por supuesto, para cualquier solución fácil que usted puede intentar. awk es lo suficientemente potente como para hacer el trabajo, que diablos, en teoría, podría implementar perl en awk…
  • Es este uno de esos sobreviviente de desafíos, donde usted tiene que vivir durante tres días comiendo sólo las termitas? Si no, en serio, ¿por qué la restricción? Cada sistema moderno puede instalar en menos de Perl, y a partir de ahí, usted tiene toda la web
InformationsquelleAutor codaddict | 2009-12-10

14 Comentarios

  1. 54

    También podrías hacer algo como esto (siempre que haya lynx instalado)…

    Lince versiones < 2.8.8

    lynx -dump -listonly my.html

    Lince versiones >= 2.8.8 (cortesía de @condit)

    lynx -dump -hiddenlinks=listonly my.html
    • En Lynx 2.8.8 esto se ha convertido en lynx -dump -hiddenlinks=listonly my.html
  2. 35

    Usted lo pidió:

    $ wget -O - http://stackoverflow.com | \
      grep -o '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
      sed -e 's/^<a href=["'"'"']//' -e 's/["'"'"']$//'

    Este es un crudo de la herramienta, por lo que todas las habituales advertencias acerca de intentar analizar HTML con expresiones regulares aplicar.

    • Casi perfecto, pero, ¿qué acerca de estos dos casos: 1. Son coincidentes sólo aquellos que comienzan con <a href <a title=»Title» href=»ejemplo»>me Match</a> 2. Lo que si hay dos anclajes en la misma línea que he hecho este modificaciones a la solución original: code gato index.html | grep -o ‘<a .*href=.*>’ | sed -e ‘s/</a\n<a/g’ | sed -e ‘s/<a .*href=[‘»‘»‘»]//’ -e ‘s/[«‘»‘»‘].*$//’ -e ‘/^$/ d’ code
    • impresionante! gracias!
    • gracias, funciona en Mac en comparación con muchas otras soluciones mencionadas
  3. 14
    grep "<a href=" sourcepage.html
      |sed "s/<a href/\n<a href/g" 
      |sed 's/\"/\"><\/a>\n/2'
      |grep href
      |sort |uniq
    1. La primera grep busca las líneas que contienen direcciones url. Usted puede agregar más elementos
      después, si usted quiere ver solamente sobre las páginas, por lo que no http, pero
      ruta de acceso relativa.
    2. El primer sed va a añadir una nueva línea en el frente de cada a href url de la etiqueta con el \n
    3. La segunda sed de acortar la url después de la 2ª » en la línea reemplazando con el /a etiqueta con un salto de línea
      Ambos sed le dará a cada url en una sola línea, pero no es basura, así que
    4. La 2ª grep href limpia el desorden
    5. La ordenación y uniq, te daremos un ejemplo de cada una url existente presentes en el sourcepage.html
    • Buen descanso abajo de lo que cada paso debe hacer.
  4. 14

    Con el Xidel – HTML/XML de datos de la herramienta de extracción de, esto se puede hacer a través de:

    $ xidel --extract "//a/@href" http://example.com/

    Con la conversión de direcciones Url absolutas:

    $ xidel --extract "//a/resolve-uri(@href, base-uri())" http://example.com/
    • concat espera 2 argumentos, pero sólo uno (url base es dado). err:XPST0017: función desconocida: concat #1 Did you mean: En el módulo w3.org/2005/xpath-functions: concat #2-65535
    • Tienes razón, eso es superfluo aquí. Quitó. Gracias por darse cuenta!
  5. 11

    Un ejemplo, ya que no dio ninguna muestra de

    awk 'BEGIN{
    RS="</a>"
    IGNORECASE=1
    }
    {
      for(o=1;o<=NF;o++){
        if ( $o ~ /href/){
          gsub(/.*href=2/,"",$o)
          gsub(/2.*/,"",$o)
          print $(o)
        }
      }
    }' index.html
    • Hace este trabajo para ‘<a href=»aktuell.de.selfhtml.org» target=»_blank»>SELFHTML actualidad</a>’
    • si me dicen que funciona, (tal vez no al 100%, pero el 99.99%) de la época, ¿lo pueden creer?? :). Lo mejor es probar a sí mismo en varias páginas y ver.
    • esto realmente hizo el trabajo, grandes y muchas gracias por este gran awk paquete!
  6. 9

    Hice un par de cambios a Greg Tocino Solución

    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:

    1. Somos coincidentes casos en que el ancla no se inicia con href como primer atributo
    2. Estamos cubriendo la posibilidad de tener varios anclajes en la misma línea
    • Pero al menos se resuelve el problema, ninguna de las otras soluciones no
    • La mejor opción si usted no desea utilizar el Lince y sus anclajes no empieza con <a href…
  7. 5

    Estoy asumiendo que usted desea extraer una dirección URL de algunas de texto HTML, y no parse HTML (como uno de los comentarios que sugiere). Lo creas o no, alguien ya ha hecho esto.

    OT: La sed sitio web tiene un mucho de buena información y muy interesante/loca sed de secuencias de comandos. Usted puede incluso jugar Sokoban en el sed!

    • Esta es la más fácil y sencilla respuesta. Acaba de hacer por ejemplo, wget http://sed.sourceforge.net/grabbag/scripts/list_urls.sed -O ~/bin/list_urls.sed && chmod +x ~/bin/list_urls.sed para obtener la secuencia de comandos y, a continuación, wget http://www.example.com -O - | ~/bin/list_urls.sed > example.com.urls.txt para obtener la url en un archivo de texto!
  8. 4

    Usted puede hacerlo fácilmente con la siguiente expresión regular, que es bastante bueno en la búsqueda de Url:

    \b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

    Me tomó de John Gruber del artículo sobre cómo encontrar direcciones Url en el texto.

    Que le permite encontrar todas las direcciones Url en un archivo f.html de la siguiente manera:

    cat f.html | grep -o \
        -E '\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'
    • complicada, y no cuando href es como este: … HREF=»somewhere.com» ADD_DATE=»1197958879″ LAST_MODIFIED=»1249591429″> …
    • Lo he probado en el daringfireball página en sí y se encuentran todos los enlaces. otras soluciones pueden fallar debido a href= podría estar en algún lugar en el interior de texto normal. es difícil obtener esta absolutamente correcto sin necesidad de analizar el código HTML de acuerdo a su gramática.
    • Usted no necesita tener un gato antes de que el grep. Acabo de poner f.html al final de grep
    • Y grep -o puede fallar debido a un error en algunas versiones de grep.
  9. 2

    En bash, el siguiente debe funcionar. Tenga en cuenta que no uso sed o awk, pero utiliza tr y grep, ambos muy estándar y no el perl 😉

    $ cat source_file.html | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' -e '^http://' -e'^//' | sort | uniq

    por ejemplo:

    $ curl "https://www.cnn.com" | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' -e '^http://' -e'^//' | sort | uniq

    genera

    //s3.amazonaws.com/cnn-sponsored-content
    //twitter.com/cnn
    https://us.cnn.com
    https://www.cnn.com
    https://www.cnn.com/2018/10/27/us/new-york-hudson-river-bodies-identified/index.html\
    https://www.cnn.com/2018/11/01/tech/google-employee-walkout-andy-rubin/index.html\
    https://www.cnn.com/election/2016/results/exit-polls\
    https://www.cnn.com/profiles/frederik-pleitgen\
    https://www.facebook.com/cnn
    etc...
  10. 1

    Ir con un primer paso reemplazar el inicio de la url (http) con un salto de línea (\nhttp). Entonces usted tiene garantizado por sí mismo que su enlace comienza al principio de la línea y es la única dirección URL en la línea.

    El resto debe ser fácil, aquí está 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"; }; _'

  11. 1

    Expansión en kerkael la respuesta:

    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 he añadido elimina los enlaces a los locales favoritos.

    El segundo elimina los enlaces relativos a los niveles superiores.

    El tercer elimina los enlaces que no empieza con http.

    Escoger y elegir uno de estos utiliza según sus requisitos específicos.

  12. 0

    Usted puede 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>&nbsp;<\/td>//g'| column -c2 -t|awk '{print $1}'
    • Por favor, dar formato al código!
  13. 0

    Que es como yo lo probé para ver mejor, crear archivo de shell y dar enlace como parámetro, se va a crear temp2.txt archivo.

    a=$1
    
    lynx -listonly -dump "$a" > temp
    
    awk 'FNR > 2 {print$2}' temp > temp2.txt
    
    rm temp
    
    >sh test.sh http://link.com
    • Yo sugiero utilizar una tubería en lugar de archivos temporales: lynx -listonly -dump «$url» | awk ‘FNR > 2 {print$2}’
  14. -1

    Este es mi primer post, así que trataré de hacer mi mejor explicando por qué he puesto esta respuesta…

    1. Desde los 7 primeros más votados respuestas, 4 incluyen GREP incluso cuando el
      post dice explícitamente que «el uso de sed o awk sólo».
    2. Incluso cuando el puesto requiere «No perl, por favor», debido a la anterior
      punto, y debido a que el uso de PERL regex dentro de grep.
    3. y porque esta es la manera más sencilla ( por lo que yo sé , y fue
      se requiere ) para hacerlo en BASH.

    Así que aquí viene la más simple secuencia de comandos de GNU grep 2.28:

    grep -Po 'href="\K.*?(?=")'

    Acerca de la \K interruptor , no info fue fundada en el HOMBRE y en las páginas INFO, así que me vino aquí por la respuesta….
    el \K interruptor de deshacerse de los anteriores caracteres ( y la misma clave ).
    Tener en cuenta siguiendo los consejos de las páginas man:
    «Esto es muy experimental y grep -P puede advertir de características no implementadas.»

    Por supuesto, usted puede modificar la secuencia de comandos para satisfacer sus gustos o necesidades, pero me pareció bastante recta, para lo que fue solicitado en el post , y también para muchos de nosotros…

    Espero que a la gente le resulta muy útil.

    gracias!!!

Dejar respuesta

Please enter your comment!
Please enter your name here