2011-10-13 2 views
8

Va bene con il modo in cui sottostante è estraendo solo URL di riferimento come questo codiceCome estrarre URL completo con HtmlAgilityPack - C#

l'estrazione:

foreach (HtmlNode link in hdDoc.DocumentNode.SelectNodes("//a[@href]")) 
{ 
    lsLinks.Add(link.Attributes["href"].Value.ToString()); 
} 

il codice URL

<a href="Login.aspx">Login</a> 

L'url estratto

Login.aspx 

ma voglio ottenere legame reale quale browser analizzato come

http://www.monstermmorpg.com/Login.aspx 

posso farlo con il controllo l'url se contenente http e se non aggiungere il valore del dominio, ma può causare alcuni problemi in alcuni occasioni e io non credo una soluzione molto saggia.

C# 4.0, HtmlAgilityPack.1.4.0

+0

È necessario considerare l'URL, se esiste un elemento 'base' nel documento analizzato e se i percorsi sono relativi, assoluti o esterni. – Oded

risposta

15

Supponendo di avere l'URL originale, è possibile combinare la cosa URL analizzato come questo:

// 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)' 

Nota l'uso di AbsoluteUri e non basandosi su ToString() perché ToString decodifica l'URL (per renderlo più "leggibile"), che è non in genere ciò che si desidera.

+0

ma cosa succede se diciamo che l'URL scansionato è: http://www.vatanbilgisayar.com/Ev%20Bak%C4%B1m%20%C3%9Cr%C3%BCn%C3 % BC/kenwood-vc-6850-vc-6850-torbasiz-elektrikli-supurge/productdetails.aspx? I_ID = 40410 quindi come potrei ottenere l'url reale in questa domanda? – MonsterMMORPG

+1

E i percorsi relativi/root? Cosa succede se c'è un elemento 'base'? – Oded

+0

@MonsterMMORPG Funzionerà ancora - Ho aggiornato la risposta con un altro esempio –

2

posso farlo con il controllo l'url se contenente http e se non aggiungere il valore del dominio

è quello che si dovrebbe fare. Html Agility pacchetto ha nulla a che aiutare con questo:

var url = new Uri(
    new Uri(baseUrl).GetLeftPart(UriPartial.Path), 
    link.Attributes["href"].Value) 
); 
+0

grazie, ma diciamo che l'URL scansionato è: http://www.vatanbilgisayar.com/Ev%20Bak%C4%B1m%20%C3%9Cr%C3%BCn%C3%BC/kenwood-vc-6850-vc- 6850-torbasiz-elektrikli-supurge/productdetails.aspx? I_ID = 40410 - in questo caso come posso ottenere? – MonsterMMORPG

+0

@MonsterMMORPG, potresti usare 'var url = new Uri (new Uri (baseUrl) .GetLeftPart (UriPartial.Path), link.Attributes [" href "]. Value));'. –

+0

la sintassi non è corretta e ora è possibile risolvere il problema. quindi non funziona e dà errore. anche l'url di base indica l'url della pagina scansionata a destra – MonsterMMORPG