47 votes

Comment analyser une url en Ruby pour obtenir le domaine principal ?

Je veux être capable d'analyser n'importe quelle URL avec Ruby pour obtenir la partie principale du domaine sans l'élément www (juste le example.com )

92voto

Simone Carletti Points 77653

Veuillez noter il n'existe pas de méthode algorithmique permettant de déterminer le niveau le plus élevé auquel un domaine peut être enregistré pour un domaine de premier niveau particulier (les politiques diffèrent selon les registres), la seule méthode consiste à créer une liste de tous les domaines de premier niveau et du niveau auquel les domaines peuvent être enregistrés.

C'est la raison pour laquelle le Liste des suffixes publics existe.

Je suis l'auteur de PublicSuffix une bibliothèque Ruby qui décompose un domaine en ses différentes parties.

Voici un exemple

require 'uri/http'

uri = URI.parse("http://toolbar.google.com")
domain = PublicSuffix.parse(uri.host)
# => "toolbar.google.com"
domain.domain
# => "google.com"

uri = URI.parse("http://www.google.co.uk")
domain = PublicSuffix.parse(uri.host)
# => "www.google.co.uk"
domain.domain
# => "google.co.uk"

71voto

Mischa Points 26200

Cela devrait fonctionner avec à peu près n'importe quelle URL :

# URL always gets parsed twice
def get_host_without_www(url)
  url = "http://#{url}" if URI.parse(url).scheme.nil?
  host = URI.parse(url).host.downcase
  host.start_with?('www.') ? host[4..-1] : host
end

Ou :

# Only parses twice if url doesn't start with a scheme
def get_host_without_www(url)
  uri = URI.parse(url)
  uri = URI.parse("http://#{url}") if uri.scheme.nil?
  host = uri.host.downcase
  host.start_with?('www.') ? host[4..-1] : host
end

Vous devrez peut-être require 'uri' .

4voto

nlsrchtr Points 26

Juste une petite note : pour surmonter le second parsing de l'url du second exemple de Mischa, vous pourriez faire une comparaison de chaîne au lieu de URI.parse.

# Only parses once
def get_host_without_www(url)
  url = "http://#{url}" unless url.start_with?('http')
  uri = URI.parse(url)
  host = uri.host.downcase
  host.start_with?('www.') ? host[4..-1] : host
end

L'inconvénient de cette approche est qu'elle limite l'url aux urls basées sur http(s), ce qui est largement la norme. Mais si vous l'utilisez de manière plus générale (par exemple pour les liens ftp), vous devez vous adapter en conséquence.

3voto

Sam Points 692

Adressable est probablement la bonne réponse en 2018, surtout utilise la gemme PublicSuffix pour analyser les domaines .

Cependant, j'ai besoin d'effectuer ce type d'analyse à plusieurs endroits, à partir de diverses sources de données, et j'ai trouvé qu'il était un peu verbeux pour être utilisé à plusieurs reprises. J'ai donc créé une enveloppe autour de lui, Adomain :

require 'adomain'

Adomain["https://toolbar.google.com"]
# => "toolbar.google.com"

Adomain["https://www.google.com"]
# => "google.com"

Adomain["stackoverflow.com"]
# => "stackoverflow.com"

J'espère que cela aidera d'autres personnes.

1voto

pguardiario Points 19925

En voici un qui fonctionne mieux avec les domaines de type .co.uk et .com.fr.

domain = uri.host[/[^.\s\/]+\.([a-z]{3,}|([a-z]{2}|com)\.[a-z]{2})$/]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X