使用 .Net 加载 DOM 并在服务器端执行 javascript

IT技术 javascript .net jint envjs jurassic
2021-03-14 03:03:00

我想使用文档(以字符串形式)或 URL 加载 DOM,然后对其执行 javascript 函数(包括 jquery 选择器)。这将完全是服务器端,在进程中,没有客户端/浏览器。

基本上我需要加载 dom,然后使用 jquery 选择器和 text() & type val() 函数从中提取字符串。我真的不需要操纵 dom。

我查看过 .Net javascript 引擎,例如 Jurassic 和 Jint,但都不支持加载 DOM,因此无法执行我需要的操作。

如果存在,我愿意考虑非 .Net 解决方案(node.js、ruby 等),但我真的更喜欢 .Net。

编辑 下面是一个很好的答案,但目前我正在尝试不同的路线,我正在尝试将 envjs 移植到侏罗纪。如果我能让它工作,我认为它会做我想要的,请继续关注......

1个回答

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

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

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

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

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

CsQuery 的 DOM 实现与浏览器的 DOM 实现非常不同,因为 C# 是一种强类型语言而 javascript 不是。为此目的,仅使用已经用 javascript 编写的 jsdom 会容易得多——理论上它应该在侏罗纪中按原样运行,尽管我不知道以前是否有人尝试过。(我实际上开始从 jsdom 借用单元测试用于 CsQuery)。
2021-04-26 03:03:00
我一直在研究这个 - 有一些你需要的东西在侏罗纪中没有,但还有另一个名为 jurascript 的项目,它具有所需的点点滴滴。 jurassic.codeplex.com/discussions/360450
2021-05-02 03:03:00
CsQuery 能否充当侏罗纪的 DOM(带有一点包装层)?
2021-05-12 03:03:00
我真的希望有人有时间和精力来解决这个问题。我喜欢侏罗纪,如果它只是去除了粗糙的边缘,我会在各种项目中使用它……它应该是 .NET 无头浏览器的核心!但是在我的情况下我还没有完全能够让它工作,并且缺乏保存和加载编译后的 DLL 的能力令人沮丧,并且使它对于很多用途来说太慢了。(我知道其他人一直在努力,但我从来没有能够在我的情况下让它发挥作用)。我只是有太多其他项目要处理这个项目,而 V8+wrapper 可以工作(如果丑陋的话)。
2021-05-12 03:03:00
我们应该设置一个kickstarter :)
2021-05-14 03:03:00