Как извлечь полный URL-адрес с помощью HtmlAgilityPack - C # - PullRequest
8 голосов
/ 14 октября 2011

В порядке, указанном ниже, он извлекает только ссылающуюся ссылку, подобную этой

код извлечения:

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

Код ссылки

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

Извлеченную ссылку

Login.aspx

Но я хочу получить реальную ссылку, которую браузер анализировал как

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

Я могу сделать это, проверив URL-адрес, содержащий http и, если нет, добавить значение домена, но это можетвызывают некоторые проблемы в некоторых случаях, и я думаю, что не очень мудрое решение.

c # 4.0, HtmlAgilityPack.1.4.0

Ответы [ 2 ]

15 голосов
/ 14 октября 2011

Предполагая, что у вас есть исходный URL-адрес, вы можете объединить проанализированный URL-адрес примерно так:

// 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, "/6681889/kak-izvlech-polnyi-url-adres-s-pomoschy-htmlagilitypack-c");
Console.WriteLine (url.AbsoluteUri); // prints '/6681889/kak-izvlech-polnyi-url-adres-s-pomoschy-htmlagilitypack-c'

// other...
url = new Uri(baseUrl, "javascript:void(0)");
Console.WriteLine (url.AbsoluteUri); // prints 'javascript:void(0)'

Обратите внимание на использование AbsoluteUri и не полагайтесь на ToString(), потому что ToString декодирует URL (чтобы сделать его более "читабельным для человека"), что обычно равно , а не , как вам нужно.

2 голосов
/ 14 октября 2011

Я могу сделать это с помощью проверки URL-адреса, содержащего http и, если нет, добавить значение домена

Вот что тебе следует делать. Html Agility Pack не поможет вам в этом:

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