3

我正在研究 csv 下载器项目,我需要下载网页上生成的 CSV 文件。并使用 html 敏捷性,我找到了包含 csv 文件链接的确切链接

<a href="/content/fo/contractvol/datafiles/OPTIDX_NIFTY_CE_31-08-2012_TO_31-08-2012.csv" target="_blank">Download file in csv format</a>

现在我想要,在我没有任何活动的情况下,应用程序必须在网页中检测到这个链接(我可以通过 Htmlagility 来完成),并且一旦网页在我的应用程序的 Web 浏览器中完全导航,就应该下载文件。我在其中一个 SO click here帖子中尝试了一些示例,但得到

错误:对象引用未设置为对象的实例。

HtmlElementCollection links = webBrowser.Document.GetElementsByTagName("A");

foreach (HtmlElement link in links)  // this ex is given another SO post 
{
    if (link.InnerText.Equals("My Assigned"))
        link.InvokeMember("Click");
}

任何机构都可以建议怎么做吗?

解决了 :

我改为HtmlElementCollection links = webBrowser.Document.GetElementsByTagName("A"); 使用HtmlElementCollection links = webBrowser1.Document.Links

 if (link.InnerText.Contains("My Assigned"))
{
        link.InvokeMember("Click");
}

. 谁有更好的解决方案?

4

2 回答 2

1

实际上,我会摆脱 HTMLAgility 包(它非常糟糕),然后自己去/循环它。另外,不要使用innerText,因为根据您的示例,至少一个链接中似乎没有innertext。使用 .href 属性并检查 .csv 扩展名。

link.href.EndsWith(".csv")

如果每个页面上有多个 .cvs,请查找一些 url 字符串或内部文本属性来完善它。

此外,您的 .GetElementsByTagName("A") 不起作用的原因是因为 TagName 是指任何特定 TAG 的名称属性。所以,你是说,获取所有带有TagType name="A"的 TAG ......这有意义吗?我认为有一个 .GetElementsByTag[Type] 或类似的东西,您可以使用它来基于标签类型而不是标签的名称属性。

另外,您如何下载 .csv 文件?是出现“下载对话框”框还是只是在 webbrowser 控件中显示人员?(好奇你是如何处理那部分的)。

于 2012-09-01T18:15:37.040 回答
1

InnerText 可能为空,因此请构建安全措施,以检查是否为空:

if ((link.InnerText != null) && (link.InnerText.Equals("My Assigned")) )
        link.InvokeMember("Click"); 
于 2012-09-01T12:05:08.120 回答