【问题标题】:HtmlAgilityPack in windows store appWindows 商店应用程序中的 HtmlAgilityPack
【发布时间】:2014-04-21 03:58:41
【问题描述】:

所以我在控制台应用程序中有一些工作测试代码,我将转移到 Windows 商店应用程序。现在的问题是,我刚刚复制了我在控制台应用程序中的 HtmlAgilityPack 代码,现在它不起作用。我确实有 HtmlAgilityPack 作为参考...

现在一些 HtmlAgilityPack 可以工作了。什么不工作是
“using (var client = new WebClient())”只是通过错误“找不到类型或命名空间名称'WebClient'(您是否缺少 using 指令或程序集引用?)”

下一个不起作用的部分是 "foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))" 在 selectnodes 部分,错误"'HtmlAgilityPack.HtmlNode'不包含'SelectNodes'的定义并且没有扩展可以找到接受“HtmlAgilityPack.HtmlNode”类型的第一个参数的方法“SelectNodes”(您是否缺少 using 指令或程序集引用)”

现在 N 知道 Html Agility Pack 依赖 .NET 来实现 XPATH。并且 WinRT 不支持 XPATH。现在我的问题是,我将如何使用将在 Windows 商店应用程序中运行的东西完成下面的相同操作?

下面的代码执行以下操作。从http://www.dubstep.net/track/5436 下载html 页面,一旦找到#,就循环查找href。它采用上面的 href 并将其作为 uri 发送。

我已验证以下代码在控制台应用程序中确实有效。

 using (var client = new WebClient())
        {
            // Download the HTML
            string html = client.DownloadString("http://www.dubstep.net/track/5436");

            // Now feed it to HTML Agility Pack:
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);
            int i = 0;
            // Now you could query the DOM. For example you could extract
            // all href attributes from all anchors:
            List<string> list = new List<string>();
            foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
            {
                HtmlAttribute href = link.Attributes["href"];
                if (href != null)
                {
                    list.Add(href.Value);
                    i++;
                    if (href.Value == "#")
                    {
                        int t = i - 2;
                        Uri test = new Uri(list[t]);
                        start(test);
                    }
                }
            }
        }

 public static void start(Uri t)
    {
        Uri remoteUri = new Uri("http://soundcloud.com/dubstep/spag-heddy-the-master-vip/download");
        string fileName1 = "t", myStringWebResource = null;

        // Create a new WebClient instance.
        using (WebClient myWebClient = new WebClient())
        {
            myWebClient.DownloadFileCompleted += DownloadCompleted;
            myWebClient.DownloadProgressChanged += myWebClient_DownloadProgressChanged;
            myWebClient.DownloadFileAsync(t, "file.mp3");
        }
    }

【问题讨论】:

    标签: c# windows-runtime


    【解决方案1】:

    您可以尝试将 WebClient 替换为 HtmlWeb 并使用 HtmlAgilityPack 的 LINQ API 而不是 XPath,以使其在 Windows 应用商店应用中运行:

    //use HAP's HtmlWeb instead of WebClient
    var htmlweb = new HtmlWeb();
    // load HtmlDocument from web URL
    HtmlDocument doc = htmlweb.Load("http://www.dubstep.net/track/5436");
    
    
    int i = 0;
    List<string> list = new List<string>();
    
    //use LINQ API to select all `<a>` having `href` attribute
    var links = doc.DocumentNode
                   .DescendantsAndSelf("a")
                   .Where(o => o.GetAttributeValue("href", null) != null);
    foreach (HtmlNode link in links)
    {
        HtmlAttribute href = link.Attributes["href"];
        if (href != null)
        {
            list.Add(href.Value);
            i++;
            if (href.Value == "#")
            {
                int t = i - 2;
                Uri test = new Uri(list[t]);
                start(test);
            }
        }
    }
    

    【讨论】:

    • 嗯,似乎我收到错误“'HtmlAgilityPack.HtmlWeb'不包含'Load'的定义,并且没有扩展方法'Load'接受'HtmlAgilityPack.HtmlWeb'类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)” 上面的代码..非常感谢您的帮助!我一直在查看一些 linq 代码,但从那以后并没有做太多..
    • 啊,我错过了那部分,我也没有在 WinRT 中尝试过 HAP。尝试用await htmlweb.LoadFromWebAsync(...)替换htmlweb.Load(...)
    • this "HtmlDocument doc = await htmlweb.LoadFromWebAsync("dubstep.net/track/5436");" 返回错误“'await' 运算符只能在异步方法中使用。考虑使用 'async' 修饰符标记此方法,并将其返回类型更改为 'Task'。”但从我也看过的内容来看,这应该可以工作
    • 将上述代码所在的函数标记为async,例如:private void async MyFunction()。如需进一步参考:stackoverflow.com/questions/11836325/…
    • 谢谢!它让那部分工作!现在我的下一个问题是如何使用 htmlweb 下载文件?我添加了启动方法,以显示我当前如何下载它..
    【解决方案2】:

    对于 XPath,您可以使用以下链接查找 XPath for Windows Phone 的实现(+源代码)。代码很容易转移到 WinRT。

    注意:使用 LINQ 通常远优于使用 XPath。有一种情况是不正确的——如果您的 XPath 来自服务器。在这种情况下,您可以使用这样的解决方案。

    http://socialebola.wordpress.com/2011/07/06/xpath-support-for-the-html-agility-pack-on-windows-phone/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多