Получить все ссылки на странице html?
Я работаю над небольшим хобби-проектом. Я уже написал код, чтобы получить url, загрузить заголовок и вернуть тип/тип mime.
Тем не менее, шаг до этого - тот, который я застрял - мне нужно получить содержимое всех URL-адресов на странице, основанной внутри тега, и в кавычках, т.е.
...
<link rel='shortcut icon' href="/static/favicon.ico" type="image/x-icon" />
...
Найдет ссылку favicon.
Есть ли что-нибудь полезное в библиотеке .net или это будет случай для регулярного выражения?
Ответы
Ответ 1
Я бы посмотрел, используя Html Agility Pack.
Вот пример прямо со страницы их примеров о том, как найти все ссылки на странице:
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(/* url */);
foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
}
Ответ 2
Вам нужно использовать HTML Agility Pack.
Например:
var doc = new HtmlWeb().Load(url);
var linkTags = doc.DocumentNode.Descendants("link");
var linkedPages = doc.DocumentNode.Descendants("a")
.Select(a => a.GetAttributeValue("href", null))
.Where(u => !String.IsNullOrEmpty(u));
Ответ 3
В BCL нет ничего встроенного, но, к счастью, вы можете использовать HTML Agility Pack, чтобы выполнить эту задачу достаточно просто.
Что касается вашей конкретной проблемы, см. Легко извлекать ссылки из фрагмента html с помощью HtmlAgilityPack:
private List<string> ExtractAllAHrefTags(HtmlDocument htmlSnippet)
{
List<string> hrefTags = new List<string>();
foreach (HtmlNode link in htmlSnippet.DocumentNode.SelectNodes("//a[@href]"))
{
HtmlAttribute att = link.Attributes["href"];
hrefTags.Add(att.Value);
}
return hrefTags;
}
Ответ 4
Как насчет Regex?
<(a|link).*?href=(\"|')(.+?)(\"|').*?>
с флагами IgnoreCase
и SingleLine
Смотрите демонстрацию на systemtextregularexpressions.com regex.matches