web-dev-qa-db-fra.com

Comment analyseriez-vous une URL en Ruby pour obtenir le domaine principal?

Je veux pouvoir analyser n'importe quelle URL avec Ruby pour obtenir la partie principale du domaine sans la www (uniquement XXXX.com)

36
Justin Meltzer

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'.

60
Mischa

Veuillez noter que il n’existe aucune méthode algorithmique pour rechercher le niveau le plus élevé auquel un domaine peut être enregistré pour un domaine de niveau supérieur particulier (les stratégies diffèrent d’un registre à l’autre). les domaines de niveau inférieur et le niveau auquel les domaines peuvent être enregistrés. 

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

Je suis l'auteur de PublicSuffix , une bibliothèque Ruby qui décompose un domaine en 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"
75
Simone Carletti

Juste une petite remarque: pour surmonter la deuxième analyse de l'URL du second exemple de Mischas, vous pouvez effectuer 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 URL basées sur http (s), ce qui est largement la norme. Mais si vous l’utilisez plus généralement (par exemple pour les liens ftp), vous devez vous adapter en conséquence.

4
nlsrchtr

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

Cependant, je dois effectuer ce type d'analyse à plusieurs endroits, à partir de différentes sources de données, et j'ai trouvé qu'il était un peu détaillé de l'utiliser à plusieurs reprises. J'ai donc créé un emballage 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 aide les autres.

2
Sam

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

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

si l'URL est au format http://www.google.com, vous pouvez faire quelque chose comme:

a = 'http://www.google.com'
puts a.split(/\./)[1] + '.' + a.split(/\./)[2]

Ou

a =~ /http:\/\/www\.(.*?)$/
puts $1
0
Tudor Constantin