使用C#解析HTML链接

时间:2020-03-06 14:37:04  来源:igfitidea点击:

是否有内置的dll,它将为我提供来自字符串的链接列表。我想发送带有有效html的字符串,并让它解析所有链接。我似乎记得.net或者非托管库中内置了某些内容。

我发现了几个看起来很有希望的开源项目,但我认为有一个内置模块。如果没有,我可能不得不使用其中之一。如果没有必要的话,我只是此时不希望有外部依赖。

解决方案

Google给了我这个模块:http://www.majestic12.co.uk/projects/html_parser.php

似乎是.NET的HTML解析器。

一个简单的正则表达式-

@"<a.*?>"

传递给Regex.Matches应该可以满足需求。该正则表达式可能需要进行一些微调,但我认为它非常接近。

我认为没有内置库,但是Html Agility Pack对于我们想做的事情很受欢迎。

使用原始.NET框架且没有任何外部依赖项来执行此操作的方法是使用正则表达式来查找字符串中的所有" a"标记。我们可能需要照顾很多边缘情况。例如href =" http:// url" vs href = http:// url等。

SubSonic.Sugar.Web.ScrapeLinks似乎是我们想要的一部分,但是它从URL而不是字符串中获取html。我们可以在此处查看其实现。

我不知道有任何内置内容,因此从问题来看,我们所要查找的内容有点模棱两可。我们是要使用整个锚标记,还是只需要href属性中的URL?

如果我们拥有格式正确的XHtml,则可以使用XmlReader和XPath查询查找所有锚标记(&lt;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。如果我们实际上不打算在任何地方使用该链接,则可以消除这种情况。