it-swarm.com.de

Wie würden Sie eine URL in Ruby analysieren, um die Hauptdomäne zu erhalten?

Ich möchte in der Lage sein, jede URL mit Ruby zu analysieren, um den Hauptteil der Domäne ohne die www zu erhalten (nur die XXXX.com)

36
Justin Meltzer

Dies sollte mit so ziemlich jeder URL funktionieren:

# 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

Oder:

# 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

Möglicherweise müssen Sie require 'uri'.

60
Mischa

Bitte beachten Sie es gibt keine algorithmische Methode zum Ermitteln der höchsten Ebene, auf der eine Domäne für eine bestimmte Top-Level-Domäne registriert werden kann (die Richtlinien unterscheiden sich mit jeder Registrierung). Die einzige Methode ist das Erstellen einer Liste aller Top-Adressen Domänen und die Ebene, auf der Domänen registriert werden können. 

Dies ist der Grund, warum die Public Suffix List existiert.

Ich bin der Autor von PublicSuffix , einer Ruby-Bibliothek, die eine Domäne in verschiedene Teile zerlegt.

Hier ist ein Beispiel

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

Nur eine kurze Anmerkung: Um die zweite Analyse der URL aus dem zweiten Beispiel von Mischas zu überwinden, können Sie anstelle von URI.parse einen Stringvergleich durchführen.

# 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

Der Nachteil dieses Ansatzes ist, dass er die URL auf http (s) basierte URLs begrenzt, was weit verbreitet ist. Wenn Sie es jedoch allgemeiner verwenden (z. B. für FTP-Links), müssen Sie dies entsprechend anpassen.

4
nlsrchtr

Adressierbar ist wahrscheinlich die richtige Antwort im Jahr 2018, insbesondere verwendet das PublicSuffix-Gem zum Parsen von Domänen .

Allerdings muss ich diese Art des Parsens an verschiedenen Stellen aus verschiedenen Datenquellen durchführen und finde es ein wenig ausführlich, es wiederholt zu verwenden. Also habe ich einen Wrapper erstellt, Adomain :

require 'adomain'

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

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

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

Ich hoffe das hilft anderen.

2
Sam

Hier ist eine, die besser mit .co.uk- und .com.fr-Domains funktioniert

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

wenn die URL das Format http://www.google.com hat, können Sie Folgendes tun:

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

Oder

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