1

如何在 C# 中将 document.write javascript 评估为纯文本?我正在尝试对此进行评估:

<script type="text/javascript">
a=2;b=3;
document.write(a+"_"+y);
</script>

对此:

2_3
4

1 回答 1

2

从您的评论中,“它是下载的 HTML 页面上的客户端功能”,听起来您正在执行某种屏幕抓取/抓取,而 HTML/JavaScript 没有向您的应用程序发出客户端请求?

如果我正确理解这就是您所寻求的,那么您需要一个可以“说”JavaScript 的解释器。C# 无法做到这一点,因此下一个最好的办法是在您的 C# 应用程序中启动一个能够理解/解释(并因此评估)JavaScript 的组件。

我建议查看 WebBrowser 控件和 HtmlDocument.DomDocument,将下载的 HTML 页面加载到 HtmlDocument / WebBrowser 控件中,它将运行并将 JavaScript 函数的结果包含在 HTML 中(因为 document.write 操作DOM 和生成的 HTML)。

如果您创建一个简单的表单应用程序并将 Web 浏览器控件拖到它上面,这是我刚刚编写的用于测试该理论的示例:

using System;
using System.Windows.Forms;
// Make sure to add COM reference to "Microsoft HTML Object Library" 

namespace TheAnswer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Url = new Uri("about:blank");
        }


        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            MessageBox.Show("Loaded!");

            string testHtml = @"
                <html>
                    <head>
                        <script type=""text/javascript"">
                            var a=2;var b=3;
                            document.write(a+""_""+b);
                        </script>
                    </head>
                    <body>Hello there!</body>
                </html>";


            mshtml.IHTMLDocument2 htmlDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument; // IHTMLDocument2 has the write capability (IHTMLDocument3 does not)
            htmlDoc.close();
            htmlDoc.open("about:blank");

            object html = testHtml;
            htmlDoc.write(html);
            html = null;

        }

    }
}

显然,从这里,您可以将“下载”的 HTML 插入 HTML 文档并执行它;如果您要处理多种不同类型的页面等,您可能会在此过程中遇到许多障碍;如果您总是在抓取类似类型的页面并且确定某些预期的行为或 javascript 功能,那么您可能能够取得一些结果。考虑到您提供的有关项目内容的最少信息,真的很难说更多。

我确实希望这会有所帮助,并且是您想要完成的。让我知道!

编辑:哇,我没有意识到这个问题已经 2 岁了!无论如何,回答它有一些乐趣!

于 2012-02-23T14:55:42.113 回答