代码之家  ›  专栏  ›  技术社区  ›  Shaun Bowe

使用C解析HTML链接#

  •  7
  • Shaun Bowe  · 技术社区  · 18 年前

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

    5 回复  |  直到 18 年前
        1
  •  6
  •   Jacob Proffitt    16 年前

    我没有意识到任何内在的东西,从你的问题来看,你到底在寻找什么有点模棱两可。您想要整个锚定标记,还是只想要href属性中的URL?

    如果您有格式良好的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,以确保该地址作为有效的Uri是有意义的。如果你实际上不打算在任何地方寻找链接,你可以消除这种情况。

        2
  •  5
  •   Brian Lyttle    18 年前

    我认为没有内置的图书馆,但是 Html Agility Pack 因为你想做的事而受欢迎。

    http://url “vs href= http://url

        3
  •  1
  •   Forgotten Semicolon adrianm    15 年前

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

        4
  •  0
  •   Armin Ronacher    18 年前
        5
  •  -2
  •   Harper Shelby damiankolasa    18 年前

    一个简单的正则表达式-

    传给 Regex.Matches