Как извлечь полный url-адрес с помощью HtmlAgilityPack-C#
хорошо, что ниже он извлекает только ссылочный url-адрес, как это
код извлечения :
foreach (HtmlNode link in hdDoc.DocumentNode.SelectNodes("//a[@href]"))
{
lsLinks.Add(link.Attributes["href"].Value.ToString());
}
url-код
<a href="Login.aspx">Login</a>
извлеченный url
Login.aspx
но я хочу получить реальную ссылку, какой браузер проанализирован как
http://www.monstermmorpg.com/Login.aspx
Я могу сделать это с проверкой url-адреса, содержащего http, и если не добавить значение домена, но это может вызвать некоторые проблемы в некоторых случаях, и я думаю, что не очень мудрое решение.
c# 4.0, HtmlAgilityPack.1.4.0
2 ответов
предполагая, что у вас есть исходный 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, "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)'
обратите внимание на использование AbsoluteUri
и не полагаться на ToString()
, потому что ToString
декодирует URL (чтобы сделать его более "читаемым человеком"), который является не как правило, то, что вы хотите.
Я могу сделать это с проверкой url-адреса, содержащего http, и если нет, добавьте значение домена
вот что вы должны сделать. Html Agility Pack не имеет ничего, чтобы помочь вам в этом:
var url = new Uri(
new Uri(baseUrl).GetLeftPart(UriPartial.Path),
link.Attributes["href"].Value)
);