Анализ HTML-ссылок с использованием C#


7

Есть ли встроенная dll, которая даст мне список ссылок из строки. Я хочу отправить строку с действительным html и проанализировать все ссылки. Кажется, я помню, что есть что-то, встроенное в .net или неуправляемую библиотеку.

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

1

SubSonic.Sugar.Web.ScrapeLinks, кажется, делает часть того, что вы хотите, однако он захватывает HTML из URL, а не из строки. Вы можете проверить их реализацию here.

  0

Это на самом деле то, что я хочу сделать, так что это будет отлично работать для меня. Не совсем встроенный, но, по крайней мере, SubSonic, вероятно, имел некоторый уровень тестирования/использования. 23 сен. 082008-09-23 18:55:47

  0

@Forgotten Любой шанс вы могли бы спасти этот ответ, предоставив новые и рабочие ссылки? 11 июл. 112011-07-11 20:48:59

  0

@ Lasse V. Karlsen, сделано. 11 июл. 112011-07-11 21:09:45


0

Google дает мне этот модуль: http://www.majestic12.co.uk/projects/html_parser.php

Кажется, HTML анализатор для .NET.


-2

Простое регулярное выражение -

@ "< а * >?"

передаваемым в Regex.Matches должны делать то, что вам нужно. Этому регулярному выражению может потребоваться крошечная настройка, но это довольно близко, я думаю.


5

Я не думаю, что есть встроенная библиотека, но Html Agility Pack популярен тем, что вы хотите сделать.

Способ сделать это с помощью исходной среды .NET и внешних зависимостей будет использовать регулярное выражение, чтобы найти все теги «a» в строке. Возможно, вам нужно будет позаботиться о многих крайних случаях. например HREF = «http://url» против HREF = http://url и т.д.


6

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

Если у вас хорошо сформированный XHtml, вы можете уйти с помощью XmlReader и запроса XPath, чтобы найти все якорные теги (<a>), а затем нажать на атрибут href для адреса. Поскольку это маловероятно, вам, вероятно, лучше использовать 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, чтобы убедиться, что адрес на самом деле имеет смысл в качестве действительного Ури. Вы можете устранить это, если вы на самом деле не собираетесь следовать ссылке в любом месте.

  0

+1 для обеспечения примера. Тем не менее, я хотел бы указать, что RegEx вы предоставили на образце '' <a. * Href = [\ "'] (? <url> [^ \"] + [. \\ s] *) [\ "' ]. *> (? <name> [^ <] + [.\\ S] *)</a> «' терпит неудачу в следующем случае '&lt;DIR&gt; <A HREF="..">..</a><BR> 03/02/10 4:42 вечера [GMT] &lt;DIR&gt; <A HREF="/Incoming/tmp/">tmp</a>' (она захватывает только одну гиперссылку, я получил этот пример из FTP Список каталогов) .Изменяя его на следующий RegEx: 'string anchorPattern = @" <a[\s]+[^>] *? href [\ s]? = [\ s \ "" \ '] + (? <href>. *?) [\ "" \ '] +. *?> (? <fileName> [^ <] + |. *?)? <\/a> ";' работал в любом случае, я тестировал. 27 июл. 102010-07-27 18:21:53