我正在寻找一个免费工具或dll,我可以用它在.NET中编写自己的代码来处理一些Web请求。 假设我有一个带有一些类似于http://www.example.com?param=1的查询字符串参数的URL,当我在浏览器中使用它时,会出现几个重定向,最终呈现的HTML具有框架集,框架的内部html包含一个表格,其中包含数据需要。我想以CSV格式将此数据存储在外部文件中。显然,根据查询字符串参数 param ,数据会有所不同。假设我想运行应用程序并为参数值生成1000个CSV文件,从1到1000。
我对.NET,javascript,HTML有很好的了解,但主要问题是如何在服务器代码中获取最终的HTML。
我尝试的是创建了一个新的表单应用程序,添加了一个webbrowser控件并使用了这样的代码:
private void FormMain_Shown(object sender, EventArgs e)
{
var param = 1; //test
var url = string.Format(Constants.URL_PATTERN, param);
WebBrowserMain.Navigated += WebBrowserMain_Navigated;
WebBrowserMain.Navigate(url);
}
void WebBrowserMain_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
if (e.Url.OriginalString == Constants.FINAL_URL)
{
var document = WebBrowserMain.Document.Window.Frames[0].Document;
}
}
但不幸的是,我接受了未经授权的访问,因为可能框架和文档位于不同的域中。有没有人知道如何解决这个问题,也许还有另一种全新的方法来实现这样的功能?
答案 0 :(得分:2)
感谢Noseratio的评论,我设法用WebBrowser控件做到了。以下是一些可能有助于其他有类似问题的要点:
1)应使用DocumentCompleted事件。对于Navigated事件,文档的主体为NULL。
2)以下答案帮助很多:WebBrowserControl: UnauthorizedAccessException when accessing property of a Frame
3)我不知道IHTMLWindow2类似的接口,为了使它们正常工作我添加了对以下COM库的引用:Microsoft Internet Controls(SHDocVw),Microsoft HTML Object Library(MSHTML)。
4)我用下面的代码抓住了框架的html:
void WebBrowserMain_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.OriginalString == Constants.FINAL_URL)
{
try
{
var doc = (IHTMLDocument2) WebBrowserMain.Document.DomDocument;
var frame = (IHTMLWindow2) doc.frames.item(0);
var document = CrossFrameIE.GetDocumentFromWindow(frame);
var html = document.body.outerHTML;
var dataParser = new DataParser(html);
//my logic here
}
5)对于使用Html的工作,我使用了具有一些非常好的XPath搜索的精细HTML Agility Pack。