【问题标题】:Windows Form app find Link on WebWindows 窗体应用程序在 Web 上查找链接
【发布时间】:2015-08-08 04:48:01
【问题描述】:

我需要创建一个方法来在网站(Hudson 服务器)上找到最新版本的应用程序并允许下载它。

到目前为止,我使用正则表达式扫描所有 HTML 并找到 href 标记并搜索我想要的字符串。

我想知道是否有最简单的方法。 我附上了我今天使用的代码:

namespace SDKGui
{
    public struct LinkItem
    {
        public string Href;
        public string Text;

    public override string ToString()
    {
        return Href;
    }
}

static class LinkFinder
{
    public static string Find(string file)
    {
        string t=null;
        List<LinkItem> list = new List<LinkItem>();

        // 1.
        // Find all matches in file.
        MatchCollection m1 = Regex.Matches(file, @"(<a.*?>.*?</a>)",
            RegexOptions.Singleline);


        // 2.
        // Loop over each match.
        foreach (Match m in m1)
        {
            string value = m.Groups[1].Value;
            LinkItem i = new LinkItem();

            // 3.
            // Get href attribute.
            Match m2 = Regex.Match(value, @"href=\""(.*?)\""",
            RegexOptions.Singleline);
            if (m2.Success)
            {
                i.Href = m2.Groups[1].Value;
            }

            // 4.
            // Remove inner tags from text.
            t = Regex.Replace(value, @"\s*<.*?>\s*", "",
            RegexOptions.Singleline);

            if (t.Contains("hms_sdk_tool_"))
            {
                i.Text = t;
                list.Add(i);
                break;
            }



        }
        return t;
    }

}
}

【问题讨论】:

  • 你的尝试有什么问题?
  • 为什么不直接链接到应用程序中的静态 URL,该页面会将用户重定向到最新版本。类似 www.mysoftware.com/latest
  • 对不起,我忘了注意,新版本完成后下载文件的名称会改变
  • @almog50:您是否考虑过使用HtmlAgilityPack 来收集href 值?如果是,我可以提供一个答案,说明如何做到这一点。

标签: c# regex winforms webclient-download


【解决方案1】:

很容易收集所有href 值并使用HtmlAgilityPack 过滤您的任何条件。下面的方法展示了如何访问一个页面,获取所有&lt;a&gt;标签,并返回一个包含hms_sdk_tool_的所有href值的列表:

private List<string> HtmlAgilityCollectHrefs(string url)
{
    var webGet = new HtmlAgilityPack.HtmlWeb();
    var doc = webGet.Load(url);
    var a_nodes = doc.DocumentNode.SelectNodes("//a");
    return a_nodes.Select(p => p.GetAttributeValue("href", "")).Where(n => n.Contains("hms_sdk_tool_")).ToList();
}

或者,如果您对 1 个返回字符串感兴趣,请使用

private string GetLink(string url)
{
    var webGet = new HtmlAgilityPack.HtmlWeb();
    var doc = webGet.Load(url);
    var a_nodes = doc.DocumentNode.SelectNodes("//a");
    return a_nodes.Select(p => p.GetAttributeValue("href", "")).Where(n => n.Contains("hms_sdk_tool_")).FirstOrDefault();
}

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2018-01-11
    • 1970-01-01
    • 2014-04-22
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多