1

我正在寻找一个免费的工具或 dll,我可以使用它们在 .NET 中编写自己的代码来处理一些 Web 请求。假设我有一个带有一些类似于http://www.example.com?param=1的查询字符串参数的 URL ,当我在浏览器中使用它时会发生几次重定向,最终呈现具有框架集和框架内部的 HTML html 包含一个包含我需要的数据的表。我想将此数据以 CSV 格式存储在外部文件中。显然,数据根据查询字符串参数param不同。假设我想运行应用程序并为从 1 到 1000 的参数值生成 1000 个 CSV 文件。

我对 .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;
        }
    }

但不幸的是,我收到了未授权访问异常,因为框架和文档可能位于不同的域中。有没有人知道如何解决这个问题,也许还有另一种全新的方法来实现这样的功能?

4

1 回答 1

2

感谢 Noseratio 的评论,我设法用 WebBrowser 控件做到了这一点。以下是一些可能对其他有类似问题的人有所帮助的要点:

1) 应该使用 DocumentCompleted 事件。对于文档的导航事件主体为 NULL。

2)以下答案有很大帮助:WebBrowserControl: UnauthorizedAccessException when access property of a Frame

3) 我不知道 IHTMLWindow2 类似的接口,为了让它们正常工作,我添加了对以下 COM 库的引用:Microsoft Internet 控件 (SHDocVw)、Microsoft HTML 对象库 (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 的工作,我使用了很好的HTML Agility Pack,它有一些非常好的 XPath 搜索。

于 2013-10-29T22:09:06.280 回答