Come estrarre l'url completo con HtmlAgilityPack - C #

c# extraction html-agility-pack hyperlink

Domanda

Bene, con il modo in basso si sta estraendo solo url di riferimento come questo

il codice di estrazione:

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

Il codice dell'URL

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

L'URL estratto

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

Ma voglio ottenere un collegamento reale a ciò che il browser ha analizzato come

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

Posso farlo controllando l'url sia che contenga http e se non aggiungo il valore del dominio ma potrebbe causare alcuni problemi in alcune occasioni e penso che non sia una soluzione molto saggia.

c # 4.0, HtmlAgilityPack.1.4.0

Risposta accettata

Supponendo che tu abbia l'url originale, puoi combinare l'url analizzato qualcosa 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 fare affidamento su ToString() perché ToString decodifica l'URL (per renderlo più "leggibile"), che in genere non è ciò che desideri.


Risposta popolare

Posso farlo controllando l'url sia che contenga http e se non aggiunga il valore del dominio

Questo è quello che dovresti fare. Html Agility Pack non ha nulla a che fare con questo:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché