Montag, 7. März 2016

Relative URL mit C# auflösen

Kürzlich wollte ich eine Webseite nach Links durchsuchen und diesen folgen. Dabei wurden natürlich auch relative Links gefunden, und ich stellte fest, dass es im Internet gar nicht so leicht ist, einen Weg, diese mit C# aufzulösen, zu finden. Zuerst dachte ich darüber nach, relative Links selber zu verarbeiten, wurde dann aber doch mit einer sehr einfachen Methode fündig, die ich hier vorstellen möchte.
Zuerst kurz etwas zu Links im Internet: In HTML kann wie folgt auf eine andere Seite verwiesen, also ein Link erstellt werden:

<a href="http://www.sudokudestages.blogspot.de/">Aussagekräftiger Linktext</a>

In obigem Link habe ich eine absolute URL als Ziel angegeben, zu erkennen an http://www.
Ich kann jedoch auch Seiten relativ zu meiner aktuellen Seite referenzieren, zum Beispiel:

<a href="../../p/youtube-konto.html">Aussagekräftiger Linktext</a>

Dieser Link ruft die Seite http://csharp-tricks.blogspot.de/p/youtube-konto.html auf. Da dieser Post in dem virtuellen Ordner "/2016/03/" liegt, gehen wir mittels "../../" zwei Verzeichnisse aufwärts zur Wurzel URL, und rufen von da die Seite /p/youtube-konto.html auf.
Wenn absolute Links angetroffen werden, stellt dies kein Problem dar. Befindet man sich jedoch auf einer Seite und möchte einem relativen Link folgen, ist dies etwas komplizierter, zumal auch alle anderen bekannten Pfadangaben wie oben gesehen "../../target" erlaubt sind.

Um diese Pfade nun nicht manuell zusammen bauen zu müssen kann man die Klasse System.Uri in der Form System.Uri RelativeURL = new System.Uri(BaseUri, "relative Path"); verwenden.
Als Beispiel nehmen wir den Wikipedia Artikel des "Gabelbocks". In diesem findet sich ein relativer Link zu dem Wikipedia Artikel über "Schneidezähne":

<a href="/wiki/Schneidezahn" title="Schneidezahn">Schneidezähne</a>

Um den gültigen absoluten Link zu erhalten führen wir den folgenden Code aus:
System.Uri Base = new System.Uri("https://de.wikipedia.org/wiki/Gabelbock");
System.Uri ResolvedAbsoluteURL = new System.Uri(Base, "/wiki/Schneidezahn");

Keine Kommentare:

Kommentar veröffentlichen