Ich mache eine Reihe von URLs durch und möchte sie bereinigen. Ich habe den folgenden Code:
%Vor%Wie kann ich das erweitern, um die Subdomains zu entfernen, die in einigen URLs existieren?
Das ist ein heikles Thema. Einige Top-Level-Domains akzeptieren keine Registrierungen auf der zweiten Ebene.
Vergleichen Sie example.com
und example.co.uk
. Wenn Sie einfach alles außer den letzten zwei Domänen entfernen würden, würden Sie mit example.com
und co.uk
enden, was niemals die Absicht sein kann.
Firefox löst dies, indem es nach effektiver Top-Level-Domain filtert, und sie pflegen eine Liste von allem diese Domains . Weitere Informationen finden Sie unter publicssuffix.org .
Sie können diese Liste verwenden, um alles außer der Domäne rechts neben der effektiven TLD herauszufiltern. Ich kenne keine Ruby-Bibliothek, die das tut, aber es wäre eine gute Idee, eins zu veröffentlichen!
Update : Es gibt C-, Perl- und PHP-Bibliotheken , die das tun . Bei der C-Version könnten Sie eine Ruby-Erweiterung erstellen. Alternativ könnten Sie den Code nach Ruby portieren.
Für die Nachwelt gibt es ein Update vom Oktober 2014:
Ich war auf der Suche nach einer aktuelleren Abhängigkeit, auf die ich mich verlassen konnte, und habe das Juwel public_suffix ( RubyGems ) (< a href="https://github.com/weppos/publicssuffix-ruby"> GitHub ). Es wird aktiv gepflegt und behandelt alle Top-Level-Domain- und Nested-Subdomain-Probleme, indem es eine Liste der bekannten öffentlichen Suffixe verwaltet.
In Kombination mit URI.parse zum Entfernen von Protokoll und Pfaden funktioniert es sehr gut:
%Vor%Der reguläre Ausdruck, den Sie hier benötigen, kann ein wenig schwierig sein, weil Hostnamen unendlich komplex sein können - Sie könnten mehrere Subdomains (zB. foo.bar.baz.com) oder die Top-Level-Domain (TLD) haben ) kann mehrere Teile haben (zB www.baz.co.uk).
Bereit für einen komplexen regulären Ausdruck? :)
%Vor% Lasst uns das in zwei Abschnitte aufteilen. ^(?:(?>[a-z0-9-]*\.)+?|)
wird Subdomains sammeln, indem eine oder mehrere Gruppen von Zeichen gefolgt von einem Punkt gefunden werden (gierig, so dass alle Subdomains hier übereinstimmen). Die leere Alternierung wird benötigt, wenn keine Subdomain vorhanden ist (z. B. foo.com). ([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$
erfasst den tatsächlichen Hostnamen und die TLD. Es ermöglicht entweder eine einteilige TLD (wie .info, .com oder .museum) oder eine zweiteilige TLD, bei der der zweite Teil aus zwei Zeichen besteht (wie .oh.us oder .org.uk).
Ich habe diesen Ausdruck in den folgenden Beispielen getestet:
%Vor%Beachten Sie, dass diese Regex Hostnamen, die mehr als zwei "Teile" der TLD haben, nicht richtig anpasst!
Etwas wie:
%Vor%Sie müssen weiterhin alle (Stamm-) Domänen hinzufügen, die Sie als Stammdomäne betrachten. '.uk' könnte also die Stammdomäne sein, aber Sie möchten den Host wahrscheinlich kurz vor dem '.co.uk' Teil behalten.
Das Erkennen der Subdomain einer URL ist im Allgemeinen nicht trivial - es ist einfach, wenn man nur die grundlegenden betrachtet, aber sobald man in internationales Territorium gelangt, wird das schwierig.
Bearbeiten : Betrachte Dinge wie Ссылка und so weiter.
Ich habe im Laufe der Jahre viel damit zu tun gehabt, verschiedene Crawler und Scraper zu schreiben. Mein Lieblingsstück, um das zu lösen, ist FuzzyUrl von Pete Gamache: Ссылка . Es ist für Ruby, JavaScript und Elixir verfügbar.