6 votos

Extraer el dominio de nivel superior y el dominio de segundo nivel de una URL

Me gustaría extraer el dominio de nivel superior y el dominio de segundo nivel de una URL como "https://apple.stackexchange.com/questions/ask"

Ejemplo de URL con el resultado deseado a continuación.

https://apple.stackexchange.com/questions/ask
   stackexchange.com

https://www.nytimes.com/2019/07/16/science/5g-cellphones-wireless-cancer.html
   nytimes.com

https://nextdoor.com/news_feed/?post=117602&ct=-A17-ghvVOF0tfn9vptW_5a7JOBEyP4w6_hJAZUnMQqN56952&ec=OWKiQRDj9vEHefhwfGYAE0s%3D&lc=1002&is=tpe
   nextdoor.com

https://www.amazon.com/gp/product/B007B60SCG/ref=ox_sc_act_title_1?smid=ATVPDKIKX0DER&psc=1
   amazon.com

http://www.verizon.net/index.php
   verizon.net

Estoy ignorando esos dominios de múltiples niveles. Prefiero usar Bash en macOS.

Hay muchas páginas sobre cómo obtener el nombre de dominio completo:

  1. Extraer nombre de dominio de URL usando sustitución de parámetros de shell bash

    https://www.cyberciti.biz/faq/get-extract-domain-name-from-url-in-linux-unix-bash/

  2. echo http://example.com/index.php | awk -F[/:] '{print $4}'

    https://stackoverflow.com/a/11385736/1360075

No necesito este nivel de perfección.

https://github.com/john-kurkowski/tldextract

0 votos

Si nadie tiene una respuesta después de unos días, considera agregar una pequeña edición con una tabla de 3 o 4 ejemplos de lo que realmente significa "top/second". La biblioteca que mencionas tiene una tabla de búsqueda, así que no sabemos si te importa un patrón o simplemente una tabla de búsqueda más pequeña.

3 votos

¿Solo necesitas extraer nombres de dominio .com? ¿Te preocupa acerca de dominios de múltiples niveles, como .co.uk?

0 votos

No tenía ninguna idea de cómo se llamaban los componentes de una URL. En mi búsqueda en estos foros, el nombre de dominio parecía incluir www.example.com, lo cual no quería. Solo quería example.com. Recurrí a Google, donde encontré esos nombres. No parece haber una definición uniforme de los componentes. mattcutts.com/blog/seo-glossary-url-definitions y doepud.co.uk/blog/anatomy-of-a-url y doepud.co.uk/blog/anatomy-of-a-url Por alguna razón, parece que la gente en el Reino Unido es la más prolífica en la explicación de los componentes de una URL, pero también tienen nombres divertidos.

6voto

Como ya estás usando awk y estás buscando una solución simple:

awk -F/ '{n=split($3, a, "."); printf("%s.%s", a[n-1], a[n])}' <<< 'http://www.example.com/index.php'
      ^ ^   ^^^^^^^^^^^^^^^^^^                  ^^^^^^^^^^^^
      | |          |                                  |
      | |          |                            últimos dos elementos 
      | |          |
      | |          +--- Divide el 3er campo (también conocido como la parte después de //) en
      | |               el array 'a', usando '.' como separador para dividir.
      | |               Devuelve el número de elementos del array creados en 'n'.
      | |  
      | +-------------- El código awk entre las '' se ejecuta una vez por cada
      |                  línea de entrada, con los campos divididos por -F/ almacenados en
      |                  $1, $2 etc. En nuestro caso, $1 contiene "http:", $2 está 
      |                  vacío, $3 contiene "www.example.com" y $4 etc. los
      |                  varios elementos de la ruta (si los hay)
      |
      +---------------- Divide las líneas de entrada en campos, separados por '/'

1 votos

Una línea y un comando: !

0 votos

Podrías agregar un carácter de nueva línea a printf - printf("%s.%s\n" ¿podrías explicar cómo funciona tu solución?

1 votos

@fd0 Depende de lo que quieras hacer con el resultado después. Si lo asignas a una variable, no querrás tener un salto de línea al final.

4voto

Steve Evans Puntos 155

Análisis de URLs con Bash

Las siguientes preguntas deberían proporcionar un buen punto de partida:

Respuesta de @pjz descompone una URL en partes más manejables:

#!/bin/sh

INPUT_URL="https://www.amazon.com/gp/product/B007B60SCG/ref=ox_sc_act_title_1?smid=ATVPDKIKX0DER&psc=1"

# extraer el protocolo
proto="`echo $INPUT_URL | grep '://' | sed -e's,^\(.*://\).*,\1,g'`"
# eliminar el protocolo
url=`echo $INPUT_URL | sed -e s,$proto,,g`

# extraer el usuario y contraseña (si hay)
userpass="`echo $url | grep @ | cut -d@ -f1`"
pass=`echo $userpass | grep : | cut -d: -f2`
if [ -n "$pass" ]; then
    user=`echo $userpass | grep : | cut -d: -f1`
else
    user=$userpass
fi

# extraer el host -- actualizado
hostport=`echo $url | sed -e s,$userpass@,,g | cut -d/ -f1`
port=`echo $hostport | grep : | cut -d: -f2`
if [ -n "$port" ]; then
    host=`echo $hostport | grep : | cut -d: -f1`
else
    host=$hostport
fi

# extraer la ruta (si la hay)
path="`echo $url | grep / | cut -d/ -f2-`"

echo $hostport

Dado el $hostport, ahora deberías poder eliminar el dominio según se desee.

0 votos

"Dado el $hostport". Podría haber creado algo rápidamente, pero no habría sido elegante.

0 votos

Si necesitas una solución robusta, utiliza una biblioteca existente de análisis de URL. Si solo necesitas procesar un conjunto de URL restringidas una vez, un script de Bash es una elección razonable.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X