如何在 Node.js 中使用 JQuery 选择器

发布于 2024-10-05 14:37:29 字数 1041 浏览 1 评论 0原文

我正在尝试从硬盘驱动器中的 HTML 文件中提取电子邮件信息。

如果我在 firefox 中加载文件并运行 jQuerify bookmarklet 我可以成功使用以下选择器/函数

window.jQuery("a.iEmail").each(function(el) {
  console.log(window.jQuery(this).attr('href'))
});

但是在 Node.js 中使用它不起作用

var document = require("jsdom").jsdom(),
  script = document.createElement("script"),
  fs = require('fs');

fs.readFile('file_1.html', 'utf-8', function(err, data){
  if (err) {
    throw err;
  }

  // This output the document
  //console.log(data)

  var window = document.createWindow(data);

  script.src = 'http://code.jquery.com/jquery-1.4.2.js';
  script.onload = function() {
    console.log(window.jQuery.fn.jquery);
    // outputs: 1.4.2
    //console.log(window.jQuery);

    /*
     * This line works if i load the local file in firefox and execute
     * the jQuerify bookmarlet
     */
    window.jQuery("a.iEmail").each(function(el) {
      console.log(window.jQuery(this).attr('href'))
    });
  };
  document.head.appendChild(script);
});

I'm trying to extract email info from HTML files in my hard drive.

If I load the file in firefox and run jQuerify bookmarklet I can use successfully the following selector/function

window.jQuery("a.iEmail").each(function(el) {
  console.log(window.jQuery(this).attr('href'))
});

But using this in Node.js is not working

var document = require("jsdom").jsdom(),
  script = document.createElement("script"),
  fs = require('fs');

fs.readFile('file_1.html', 'utf-8', function(err, data){
  if (err) {
    throw err;
  }

  // This output the document
  //console.log(data)

  var window = document.createWindow(data);

  script.src = 'http://code.jquery.com/jquery-1.4.2.js';
  script.onload = function() {
    console.log(window.jQuery.fn.jquery);
    // outputs: 1.4.2
    //console.log(window.jQuery);

    /*
     * This line works if i load the local file in firefox and execute
     * the jQuerify bookmarlet
     */
    window.jQuery("a.iEmail").each(function(el) {
      console.log(window.jQuery(this).attr('href'))
    });
  };
  document.head.appendChild(script);
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

丢了幸福的猪 2024-10-12 14:37:29

我现在知道问题是什么了。

html 数据必须在文档创建调用中传递,因此代码如下所示:

var jsdom = require("jsdom"),
    fs = require('fs');

fs.readFile('file_1.html', 'utf-8', function(err, data){
  if (err) {
    throw err;
  }

  // This output the document
  //console.log(data)

  // HTML data should be in document creation call
  var document = jsdom.jsdom(data); // data is the html content
  var script = document.createElement("script");

  // HTML data SHOULD NOT be in window creation call
  var window = document.createWindow();

  script.src = 'http://code.jquery.com/jquery-1.4.2.js';
  script.onload = function() {
    console.log(window.jQuery.fn.jquery);
    // outputs: 1.4.2
    //console.log(window.jQuery);

    /*
     * This line works if i load the local file in firefox and execute
     * the jQuerify bookmarlet
     */
    window.jQuery("a.iEmail").each(function(el) {
      console.log(window.jQuery(this).attr('href'))
    });
  };
  document.head.appendChild(script);
});

I now know what the problem is.

The html data, must be passed in the document creation call, so the code look like this:

var jsdom = require("jsdom"),
    fs = require('fs');

fs.readFile('file_1.html', 'utf-8', function(err, data){
  if (err) {
    throw err;
  }

  // This output the document
  //console.log(data)

  // HTML data should be in document creation call
  var document = jsdom.jsdom(data); // data is the html content
  var script = document.createElement("script");

  // HTML data SHOULD NOT be in window creation call
  var window = document.createWindow();

  script.src = 'http://code.jquery.com/jquery-1.4.2.js';
  script.onload = function() {
    console.log(window.jQuery.fn.jquery);
    // outputs: 1.4.2
    //console.log(window.jQuery);

    /*
     * This line works if i load the local file in firefox and execute
     * the jQuerify bookmarlet
     */
    window.jQuery("a.iEmail").each(function(el) {
      console.log(window.jQuery(this).attr('href'))
    });
  };
  document.head.appendChild(script);
});
红尘作伴 2024-10-12 14:37:29

在 Node.js 中使用 jquery 很困难,但这是可能的。这是 jsdom 的实现:

var jsdom = require('jsdom').jsdom,
    sys = require('sys'),
    window = jsdom().createWindow();

jsdom.jQueryify(window, '/path/to/jquery.js', function (window, jquery) {
  window.jQuery('body').append("<div class='testing'>Hello World</div>");
  sys.puts(window.jQuery(".testing").text()); // outputs Hello World
});

有关详细信息,请参阅:

http:// /blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

或:

我可以将 jQuery 与 Node.js 一起使用吗?

It's tough to use jquery with node.js but it's possible. Here's an implementation with jsdom:

var jsdom = require('jsdom').jsdom,
    sys = require('sys'),
    window = jsdom().createWindow();

jsdom.jQueryify(window, '/path/to/jquery.js', function (window, jquery) {
  window.jQuery('body').append("<div class='testing'>Hello World</div>");
  sys.puts(window.jQuery(".testing").text()); // outputs Hello World
});

For more info see:

http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

or:

Can I use jQuery with Node.js?

萌能量女王 2024-10-12 14:37:29

使用 Cheerio

Cheerio 是核心 jQuery 的服务器实现,非常适合使用选择器。

您可以轻松使用 each 函数

$('a.iEmail').each(function (i, elem) {
  console.log($(this).attr('href'));
});

完整示例:

var fs = require('fs');
var cheerio = require('cheerio');

fs.readFile('file_1.html', 'utf-8', function (err, data) {
  if (err) {
    throw err;
  }

  var $ = cheerio.load(data);

  $('a.iEmail').each(function (i, elem) {
    console.log($(this).attr('href'));
  });
});

Using Cheerio

Cheerio is a server implementation of core jQuery that is perfect for using selectors.

You can easily use the each function:

$('a.iEmail').each(function (i, elem) {
  console.log($(this).attr('href'));
});

Full example:

var fs = require('fs');
var cheerio = require('cheerio');

fs.readFile('file_1.html', 'utf-8', function (err, data) {
  if (err) {
    throw err;
  }

  var $ = cheerio.load(data);

  $('a.iEmail').each(function (i, elem) {
    console.log($(this).attr('href'));
  });
});
不必了 2024-10-12 14:37:29

jsdom 以“官方”方式支持 jQuery

jsdom.env(string, [scripts], [config], callback);

简单代码:

var jsdom = require("jsdom"),
fs = require('fs');

fs.readFile('file_1.html', 'utf-8', function (err, data) {
    if (err) {
        throw err;
    }
    jsdom.env(data, ["http://code.jquery.com/jquery.js"], function (errors, window) {
        var $ = window.$;
        $("a.iEmail").each(function() {
            console.log(this.href)
        });
    })

}

https://github.com/tmpvar/jsdom#easymode

jsdom supports jQuery with "official" way.

jsdom.env(string, [scripts], [config], callback);

Simple code:

var jsdom = require("jsdom"),
fs = require('fs');

fs.readFile('file_1.html', 'utf-8', function (err, data) {
    if (err) {
        throw err;
    }
    jsdom.env(data, ["http://code.jquery.com/jquery.js"], function (errors, window) {
        var $ = window.$;
        $("a.iEmail").each(function() {
            console.log(this.href)
        });
    })

}

https://github.com/tmpvar/jsdom#easymode

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文