使用C#解析HTML链接

时间:2008-09-23 18:31:52

标签: c# .net html

是否有内置的dll会给我一个字符串链接列表。我想发送一个包含有效html的字符串,并解析所有链接。我似乎记得在.net或非托管库中内置了一些内容。

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

5 个答案:

答案 0 :(得分:6)

我不知道内置任何内容,而且从你的问题来看,你正在寻找的内容有点含糊不清。您想要整个锚标记,还是只需要来自href属性的URL?

如果您有格式良好的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 :(得分:5)

我认为没有内置库,但Html Agility Pack很受欢迎。

使用原始.NET框架并且没有外部依赖关系的方法将使用正则表达式来查找字符串中的所有“a”标记。你可能需要处理很多边缘情况。例如href =“http://url”vs href = http://url等。

答案 2 :(得分:1)

SubSonic.Sugar.Web.ScrapeLinks似乎做了你想要的一部分,但是它从一个url而不是一个字符串中抓取html。您可以查看他们的实施here

答案 3 :(得分:0)

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

似乎是.NET的HTML解析器。

答案 4 :(得分:-2)

一个简单的正则表达式 -

  

@ “&LT; A *&GT;?”

传递给Regex.Matches应该做你需要的。这个正则表达式可能需要一点点调整,但我认为它非常接近。