【问题标题】:Parse HTML links using C#使用 C# 解析 HTML 链接
【发布时间】:2010-09-12 11:29:33
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net html


    【解决方案1】:

    我不知道内置的任何内容,从您的问题来看,您正在寻找的内容有点模棱两可。你想要整个锚标记,还是只需要 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 用于提供示例。但是,我想指出您在示例"&lt;a.*href=[\"'](?&lt;url&gt;[^\"]+[.\\s]*)[\"'].*&gt;(?&lt;name&gt;[^&lt;]+[.\\s]*)&lt;/a&gt;" 中提供的RegEx 在以下情况下会失败&amp;lt;DIR&amp;gt; &lt;A HREF=".."&gt;..&lt;/A&gt;&lt;BR&gt;03/02/10 04:42PM [GMT] &amp;lt;DIR&amp;gt; &lt;A HREF="/Incoming/tmp/"&gt;tmp&lt;/A&gt;(它只捕获一个超链接,我从FTP 目录列表中获得了这个示例)。将其更改为以下正则表达式:string anchorPattern = @"&lt;a[\s]+[^&gt;]*?href[\s]?=[\s\""\']+(?&lt;href&gt;.*?)[\""\']+.*?&gt;(?&lt;fileName&gt;[^&lt;]+|.*?)?&lt;\/a&gt;"; 在我测试的任何情况下都有效。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这实际上是我想要做的,所以这对我很有用。没有完全内置,但至少 SubSonic 可能已经进行了一定程度的测试/使用。
      • @Forgotten 您是否有机会通过提供新的有效链接来挽救这个答案?
      【解决方案4】:

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

      似乎是 .NET 的 HTML 解析器。

      【讨论】:

        【解决方案5】:

        一个简单的正则表达式 -

        @""

        传递给Regex.Matches 应该可以满足您的需求。那个正则表达式可能需要一点点调整,但我认为它非常接近。

        【讨论】:

          猜你喜欢
          • 2016-01-28
          • 1970-01-01
          • 2016-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-22
          相关资源
          最近更新 更多