Есть ли встроенная DLL, которая даст мне список ссылок из строки. Я хочу отправить строку с действительным HTML и проанализировать все ссылки. Кажется, я помню, что что-то было встроено либо в .net, либо в неуправляемую библиотеку.
Я нашел пару проектов с открытым исходным кодом, которые выглядели многообещающими, но я подумал, что есть встроенный модуль. В противном случае мне, возможно, придется использовать один из них. На этом этапе мне просто не нужна была внешняя зависимость, если в этом не было необходимости.





Google дает мне этот модуль: http://www.majestic12.co.uk/projects/html_parser.php
Кажется, это парсер HTML для .NET.
Простое регулярное выражение -
@"<a.*?>"
переданный в Regex.Matches должен делать то, что вам нужно. Это регулярное выражение может потребовать небольшой настройки, но я думаю, что это довольно близко.
Я не думаю, что есть встроенная библиотека, но Пакет гибкости HTML популярен для того, чем вы хотите заниматься.
Способ сделать это с необработанной платформой .NET и без внешних зависимостей будет использовать регулярное выражение для поиска всех тегов «a» в строке. Возможно, вам придется позаботиться о многих крайних случаях. например, href = "http: // url" vs href = http: // url и т. д.
SubSonic.Sugar.Web.ScrapeLinks, кажется, делает часть того, что вы хотите, однако он захватывает html с URL-адреса, а не из строки. Вы можете проверить их реализацию здесь.
@Forgotten Есть ли шанс, что вы могли бы спасти этот ответ, предоставив новые и рабочие ссылки?
Я не знаю ничего встроенного, и из вашего вопроса немного двусмысленно, что именно вы ищете. Вам нужен весь тег привязки или только URL-адрес из атрибута href?
Если у вас есть правильно сформированный XHtml, вы можете обойтись без использования XmlReader и запроса XPath, чтобы найти все теги привязки (<a>), а затем использовать атрибут href для адреса. Поскольку это маловероятно, вам, вероятно, лучше использовать RegEx, чтобы вытащить то, что вы хотите.
Используя RegEx, вы можете сделать что-то вроде:
List<Uri> findUris(string message)
{
string anchorPattern = "<a[\s]+[^>]*?href[\s]?=[\s\\"\']+(?<href>.*?)[\\"\']+.*?>(?<fileName>[^<]+|.*?)?</a>";
MatchCollection matches = Regex.Matches(message, anchorPattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled);
if (matches.Count > 0)
{
List<Uri> uris = new List<Uri>();
foreach (Match m in matches)
{
string url = m.Groups["url"].Value;
Uri testUri = null;
if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out testUri))
{
uris.Add(testUri);
}
}
return uris;
}
return null;
}
Обратите внимание, что я бы хотел проверить href, чтобы убедиться, что адрес действительно имеет смысл как действительный Uri. Вы можете устранить это, если на самом деле не собираетесь никуда переходить по ссылке.
+1 за пример. Однако я хотел бы отметить, что RegEx, который вы предоставили в образце "<a.*href=[\"'](?<url>[^\"]+[.\s]*)[\"'].*>(?<name>[^<]+[.\\s]*)</a>", не работает в следующем случае <DIR> <A HREF = "..">..</A><BR>03/02/10 04:42PM [GMT] <DIR> <A HREF = "/Incoming/tmp/">tmp</A> (он захватывает только одну гиперссылку, я получил этот пример из списка каталогов FTP). Изменив его на следующий RegEx: string anchorPattern = @"<a[\s]+[^>]*?href[\s]?=[\s\""\']+(?<href>.*?)[\""\']+.*?>(?<fileName>[^<]+|.*?)?</a>"; работал в любом случае, который я тестировал.
На самом деле это то, что я хочу сделать, чтобы это отлично сработало для меня. Не совсем встроен, но, по крайней мере, SubSonic, вероятно, прошел некоторый уровень тестирования / использования.