我想要抓取的一些数据包含在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代码。我应该尝试不同的方法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
看起来你真的在寻找一个服务器端的Javascript引擎 - CsQuery可以很容易地为你提供脚本标签的内容,但是你需要实际运行脚本然后才能引用那些实体被创造了。虽然理论上可以创建某种查询语言来解析脚本行,但实际情况是,它基本上只是运行它。如果你只需要提取包含简单赋值的特定行,并且上下文并不重要,那么你可能正在寻找像正则表达式(甚至是grep)那样简单的东西来过滤掉你需要的东西。 / p>
我使用过Neosis V8包装 - http://javascriptdotnet.codeplex.com/ - 也作为Neosis.Javascript的nuget。
它和任何东西一样快(因为它使用谷歌的V8引擎);唯一真正的缺点是它不是一个纯粹的.NET解决方案,但一旦设置它就相当轻松。使用它的一个例子是我的项目https://github.com/jamietre/SharpLinter,它使用它来运行JsHint。
有各种各样的100%.NET Javascript引擎,如Jint,IronJS和Jurassic。我之前使用过Jurassic,它可能是最快的,因为它编译为字节码。它非常完整,但并未真正积极开发,因此可能很难获得太多支持。但是它们都比V8慢得多,并且除了没有非.NET引用之外没有任何其他优点。
除非你真的,真的需要100%.net才能使用JavscriptDotNet。