Entfernen subdomain von string in ruby
Wechsele ich über eine Reihe von URLs und will Sie zu bereinigen. Ich habe den folgenden code:
# Parse url to remove http, path and check format
o_url = URI.parse(node.attributes['href'])
# Remove www
new_url = o_url.host.gsub('www.', '').strip
Wie kann ich das verlängern, um die subdomains, die es in manchen URLs?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrieb ich einfach eine Bibliothek dazu aufgerufen Domainatrix. Sie können es hier finden: http://github.com/pauldix/domainatrix
Dies ist eine schwierige Frage. Einige top-level-domains akzeptieren keine Registrierungen auf der zweiten Ebene.
Vergleichen
example.com
undexample.co.uk
. Wenn Sie die Bänder einfach alles außer die letzten beiden Domänen, würden Sie am Ende mitexample.com
, undco.uk
, die sich nie die Absicht.Firefox löst dieses Problem durch das filtern von wirksames top-level-domain, und Sie erhalten eine Liste von alle diese domains. Weitere Informationen unter publicsuffix.org.
Diese Liste können Sie filtern alles bis auf den domain Recht neben der effektiven TLD. Ich weiß nicht, Ruby-Bibliothek, das dies tut, aber es wäre eine tolle Idee, eine veröffentlichen!
Update: es gibt C, Perl und PHP-Bibliotheken, die dies tun. Angesichts der C-version, Sie könnte erstellen Sie eine Ruby-Erweiterung. Alternativ können Sie den port, den code zu Ruby.
Für die Nachwelt, hier ein update aus Oktober 2014:
Ich war auf der Suche für eine mehr up-to-date-Abhängigkeit zu verlassen und fanden die public_suffix gem (RubyGems) (GitHub). Es wird aktiv gepflegt und behandelt alle top-level-domain und nested-subdomain Probleme durch die Aufrechterhaltung einer Liste der bekannten öffentlichen Suffixe.
In Kombination mit URI.Parsen stripping-Protokoll und Wege, es funktioniert wirklich gut:
Den regulären Ausdruck, den Sie benötigen, hier kann ein wenig schwierig sein, weil, Hostnamen werden kann, unendlich Komplex-man könnte mehrere subdomains (zB. foo.bar.baz.com), oder die top-level-domain (TLD) können mehrere Teile (zB. http://www.baz.co.uk).
Bereit für einen komplexen regulären Ausdruck? 🙂
Let ' s break dies in zwei Abschnitten.
^(?:(?>[a-z0-9-]*\.)+?|)
sammeln subdomains, indem er eine oder mehrere Gruppen von Zeichen gefolgt von einem Punkt (gierig, so dass alle subdomains sind aufeinander abgestimmt, hier). Die leere Wechsel ist notwendig in dem Fall ohne subdomain (z.B. foo.com).([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$
erfassen den tatsächlichen Hostnamen und die TLD. Es können entweder für einen Teil TLD (wie .info .com-oder .museum), oder ein Teil mit zwei TLD-wo der zweite Teil besteht aus zwei Zeichen (wie .oh.uns oder .org.uk).Getestet habe ich diesen Ausdruck auf die folgenden Beispiele:
Beachten Sie, dass diese regex nicht richtig passen Hostnamen, die mehr als zwei "Teile" für die TLD!
a.b.bigsense.io
sollte mirbigsense.io
, sondern es gibt mirb.bigsense.io
Etwas wie:
Müssen Sie noch hinzufügen, um alle (Stamm -) domains Sie betrachten root-Domäne. So '.uk' kann das root-Domäne, aber Sie wollen wahrscheinlich halten die Gastgeber kurz vor der '.co.uk " Teil.
Erkennen die Subdomäne eines URL ist nicht trivial, das zu tun in einem Allgemeinen Sinn - es ist ganz einfach, wenn Sie einfach nur betrachten Sie die grundlegenden, aber sobald man in internationales Gebiet, wird dies schwierig.
Bearbeiten: Betrachten Sie Dinge wie http://mylocalschool.k12.oh.us et al.
Warum nicht einfach Streifen .com-oder .co.Großbritannien und teilen Sie Sie dann auf '.' und das Letzte element?
Muss sagen, es fühlt sich hacky. Gibt es keine anderen Domänen, wie .co.uk?
Habe ich gerungen mit diesem viel in das schreiben verschiedener und sonstige crawler und scraper im Laufe der Jahre. Mein Lieblings Edelstein für die Lösung diese ist FuzzyUrl von Pete Gamache: https://github.com/gamache/fuzzyurl . Die verfügbaren für Ruby, JavaScript und Elixier.