In Ordnung mit dem Weg unten ist das Extrahieren nur der Verweis-URL wie folgt
der Extraktionscode:
foreach (HtmlNode link in hdDoc.DocumentNode.SelectNodes("//a[@href]"))
{
lsLinks.Add(link.Attributes["href"].Value.ToString());
}
Der URL-Code
<a href="Login.aspx">Login</a>
Die extrahierte URL
Login.aspx
Aber ich möchte einen echten Link bekommen, wie der Browser geparst hat
http://www.monstermmorpg.com/Login.aspx
Ich kann es tun mit der Überprüfung der URL, ob http enthalten und wenn nicht den Domain-Wert hinzufügen, aber es kann einige Probleme bei einigen Gelegenheiten verursachen, und ich denke, nicht eine sehr kluge Lösung.
c # 4.0, HtmlAgilityPack.1.4.0
Angenommen, Sie haben die ursprüngliche URL, können Sie die geparste URL wie folgt kombinieren:
// The address of the page you crawled
var baseUrl = new Uri("http://example.com/path/to-page/here.aspx");
// root relative
var url = new Uri(baseUrl, "/Login.aspx");
Console.WriteLine (url.AbsoluteUri); // prints 'http://example.com/Logon.aspx'
// relative
url = new Uri(baseUrl, "../foo.aspx?q=1");
Console.WriteLine (url.AbsoluteUri); // prints 'http://example.com/path/foo.aspx?q=1'
// absolute
url = new Uri(baseUrl, "http://stackoverflow.com/questions/7760286/");
Console.WriteLine (url.AbsoluteUri); // prints 'http://stackoverflow.com/questions/7760286/'
// other...
url = new Uri(baseUrl, "javascript:void(0)");
Console.WriteLine (url.AbsoluteUri); // prints 'javascript:void(0)'
Beachten Sie die Verwendung von AbsoluteUri
und nicht unter Berufung auf ToString()
, weil ToString
die URL decodiert (um es „ den Menschen lesbare“), die nicht in der Regel ist das, was Sie wollen.
Ich kann es tun mit der Überprüfung der URL, ob http enthalten und wenn nicht den Domain-Wert hinzufügen
Das solltest du tun. Html Agility Pack kann Ihnen dabei nichts helfen:
var url = new Uri(
new Uri(baseUrl).GetLeftPart(UriPartial.Path),
link.Attributes["href"].Value)
);