2011-10-13 20 views
8

Alright ze sposobu poniżej jest wyodrębnianie tylko odnosząc url jak ten kodJak wyodrębnić cały adres URL z HtmlAgilityPack - C#

ekstrakcji:

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

Kodeksu url

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

Wyodrębniony adres url

Login.aspx 

Ale chcę uzyskać rzeczywisty związek co przeglądarka analizowany jak

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

mogę zrobić ze sprawdzania URL czy zawierające http a jeśli nie dodać wartość domeny, ale może to powodować pewne problemy w niektórych przypadkach i nie sądzę bardzo mądre rozwiązanie.

C# 4.0, HtmlAgilityPack.1.4.0

+0

Musisz wziąć pod uwagę URL, jeśli w analizowanym dokumencie znajduje się element 'base' i czy ścieżki są względne, bezwzględne czy zewnętrzne. – Oded

Odpowiedz

15

Zakładając masz oryginalny URL, można połączyć przeanalizowany url coś takiego:

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

Zauważ użycie AbsoluteUri i nie polegając na ToString() ponieważ ToString dekoduje adres URL (w celu uczynienia go bardziej "czytelnym dla człowieka"), który jest zazwyczaj wymagany.

+0

, ale powiedzmy, że zindeksowany adres URL to: 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 więc jak mógłbym uzyskać prawdziwy adres URL w tym pytaniu? – MonsterMMORPG

+1

Co ze ścieżkami względnymi/zrootowanymi? Co się stanie, jeśli jest element 'base'? – Oded

+0

@MonsterMMORPG Nadal będzie działać - zaktualizowałem odpowiedź innym przykładem: –

2

mogę zrobić ze sprawdzania, czy adres URL zawierający http a jeśli nie dodać wartość domeny

To, co należy zrobić. Html Agility Pack posiada nic, aby pomóc Ci w tym:

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

dziękuję, ale powiedzmy, że przeszukany adres URL to: 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 - w takim przypadku jak mogę uzyskać? – MonsterMMORPG

+0

@MonsterMMORPG, możesz użyć 'var url = new Uri (new Uri (baseUrl) .GetLeftPart (UriPartial.Path), link.Attributes [" href "]. Value));'. –

+0

Twoja składnia jest niepoprawna i może teraz rozwiązać problem. więc to nie działa i daje błąd. także adres podstawowy oznacza adres URL strony z indeksowaniem: – MonsterMMORPG