9

I would like to load a DOM using a document (in string form) or a URL, and then Execute javascript functions (including jquery selectors) against it. This would be totally server side, in process, no client/browser.

Basically I need to load the dom and then use jquery selectors and text() & type val() functions to extract strings from it. I don't really need to manipulate the dom.

I have looked at .Net javascript engines such as Jurassic and Jint, but neither support loading a DOM, and so therefore can't do what I need.

I would be willing to consider non .Net solutions (node.js, ruby, etc) if they exist, but would really prefer .Net.

edit The below is a good answer, but currently I'm trying a different route, I'm attempting to port envjs to jurassic. If I can get that working I think it will do what I want, stay tuned....

4

1 回答 1

15

答案取决于你想要做什么。如果您的目标基本上是一个完整的 Web 浏览器模拟或“无头浏览器”,那么有许多解决方案,但没有一个(据我所知)完全存在于 .NET 中。要模仿浏览器,您需要一个 javascript 引擎和一个 DOM。您已经确定了一些引擎;我发现侏罗纪是最强大和最快的。google chrome V8引擎也很受欢迎;Neosis Javascript.NET项目为其提供了一个 .NET 包装器。它不是纯 .NET,因为您有一个非 .NET 依赖项,但它集成得很干净,使用起来并不麻烦。

但正如您所指出的,您仍然需要一个 DOM。在纯 C# 中有XBrowser,但它看起来有点陈旧。整个浏览器 DOM 也有基于 javascript 的表示形式,例如jsdom。您可能可以在侏罗纪中运行 jsdom,在没有浏览器的情况下为您提供 DOM 模拟,全部在 C# 中(虽然可能非常慢!)它肯定会在 V8 中运行得很好。如果您在 .NET 领域之外,还有其他得到更好支持的解决方案。这个问题讨论了 HtmlUnit。然后是用于自动化实际 Web 浏览器的Selenium 。

另外,请记住,围绕这些工具所做的很多工作都是为了测试。虽然这并不意味着您不能将它们用于其他用途,但它们可能无法很好地执行或集成在内联生产代码中的任何稳定用途。如果您尝试基本上进行实时 HTML 操作,那么混合了许多除了测试之外未被广泛使用的技术的解决方案可能是一个糟糕的选择。

如果您的需求实际上是 HTML 操作,并且它并不真正需要使用 Javascript,但您正在更多地考虑 JS 中可用的此类工具的丰富性,那么我会考虑为此目的设计的 C# 工具。例如HTML Agility Pack或我自己的项目CsQuery,它是一个 C# jQuery 端口。

如果您基本上是在尝试获取一些为客户端编写的代码,但在服务器上运行它——例如用于复杂/加速的网络抓取——我会使用这些术语进行搜索。例如这个问题讨论了这个问题,答案包括PhantomJS,一个无头 webkit 浏览器堆栈,以及我已经提到的一些测试工具。对于网络抓取,我想你可以在没有它的情况下生活在 .NET 中,这可能是唯一合理的答案。

于 2012-06-04T19:00:58.767 回答