Разбор HTML-ссылок с использованием C # - PullRequest
7 голосов
/ 23 сентября 2008

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

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

Ответы [ 5 ]

6 голосов
/ 24 сентября 2008

Я не знаю ничего встроенного, и из твоего вопроса немного двусмысленно, что именно ты ищешь. Вам нужен весь тег привязки или только 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. Вы можете устранить это, если вы не собираетесь никуда переходить по ссылке.

5 голосов
/ 23 сентября 2008

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

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

1 голос
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

@ "<а. *?>"

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

0 голосов
/ 23 сентября 2008

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

Кажется, что HTML-парсер для .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...