我正在研究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");
}
。任何一个更好的解决方案?
答案 0 :(得分:1)
InnerText可能为null,因此需要在safeguard中构建,以检查null:
if ((link.InnerText != null) && (link.InnerText.Equals("My Assigned")) )
link.InvokeMember("Click");
答案 1 :(得分:1)
实际上,我会摆脱HTMLAgility包(它非常糟糕),然后自己去/循环它。另外,不要使用innerText,因为根据您的示例,至少有一个链接似乎没有innertext。使用.href属性并检查.csv扩展名。
link.href.EndsWith(".csv")
如果每个页面上有多个.cvs,请查找一些url字符串或innertext属性来优化它。
此外,.GetElementsByTagName(“A”)无效的原因是因为TagName引用了任何特定TAG的name属性。所以,你说,用 TagType name =“A”获取所有TAG ......这有意义吗?我认为有一个.GetElementsByTag [Type]或类似的东西,您可以使用它来基于标签类型而不是TAG的name属性。
另外,你是如何下载.csv文件的?是否会出现“下载对话框”框,或者您只是在Web浏览器控件中显示人员? (好奇你是如何处理那部分的。)