0

我想抓取的一些数据包含在页面 JavaScript 中。它看起来类似于这种模式:

<script type="text/javascript">
        arrayName["field1"] = 12;
        arrayName["field2"] = 42;
        arrayName["field3"] = 1442;
</script>
<script type="text/javascript">
        arrayName["field4"] = 62;
        arrayName["field5"] = 3;
        arrayName["field6"] = 542;
</script>

它与大量其他 Javascript 混在一起。我需要得到这些值。

我是这样开始的:

var dom = CQ.CreateFromUrl("http://somesite.xxx");

CQ script = dom["script[type='text/javascript']"];

但我现在想不出如何获取这些数据。是创建正则表达式并遍历所有内容的唯一方法,还是有另一种性能更好的方法?

我看不到如何将 CSS 选择器用于实际的 JavaScript 代码。我应该尝试不同的方法吗?

4

2 回答 2

1

它可能不会很快,但您可以尝试为此使用 WebBrowser 控件。让它浏览到页面,然后执行您自己的 Javascript 来检索数据。例子:

var url = "http://example.com";
object arrayName;
var thread = new Thread(() =>
{
    var browser = new WebBrowser { ScriptErrorsSuppressed = true };

    // prevent popups
    browser.NewWindow += (sender, e) =>
    {
        e.Cancel = true;
    };

    browser.DocumentCompleted += (sender, eventArgs) =>
    {
        // call the Javascript eval() function, and pass it a string of what we want to evaluate. By passing "arrayName", it will simply return the value of that variable in the global scope.
        arrayName = browser.Document.InvokeScript("eval", new object[] { "arrayName" });

        browser.Dispose();
        Application.ExitThread();
    };

    browser.Navigate(url);

    Application.Run();
});

// you need this when using a WebBrowser control in a console app
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();

// now you should have something stored in the arrayName variable
于 2014-10-28T03:19:50.660 回答
0

看起来您真的在寻找服务器端 Javascript 引擎 - CsQuery 可以很容易地为您获取脚本标签的内容,但是您需要实际运行脚本,然后才能引用创建的实体。虽然理论上可以创建某种查询语言来解析脚本行,但实际情况是,这基本上只是运行它。如果您只需要提取包含简单赋值的特定行,并且上下文并不重要,那么您可能正在寻找像正则表达式(甚至 grep)这样简单的东西来过滤掉您需要的东西。

我在 nuget 上也使用了 Neosis V8 包装器——http ://javascriptdotnet.codeplex.com/——作为 Neosis.Javascript。

它和任何东西一样快(因为它在引擎盖下使用了谷歌的 V8 引擎);唯一真正的缺点是它不是一个纯粹的 .NET 解决方案,但一旦设置它就非常轻松。使用它的一个例子是在我的项目https://github.com/jamietre/SharpLinter中,它使用它来运行 JsHint。

有多种 100% .NET Javascript 引擎,例如 Jint、IronJS 和 Jurassic。我以前用过侏罗纪,它可能是最快的,因为它编译成字节码。它出人意料地完整,但并未真正得到积极开发,因此可能很难获得太多支持。但是所有这些都比 V8 慢得多,并且除了没有非 .NET 引用之外没有提供任何真正的优势。

除非你真的真的需要它是 100% .net,否则只需使用 JavscriptDotNet。

于 2014-10-29T17:34:54.997 回答