6

私は明らかに、認めようとしているよりも Javascript に少し慣れていません。Node.jsを使用してWebページを取得し、コンテンツを変数として保存しようとしているので、好きなように解析できます。

Python では、次のようにします。

from bs4 import BeautifulSoup # for parsing
import urllib

text = urllib.urlopen("http://www.myawesomepage.com/").read()

parse_my_awesome_html(text)

ノードでこれを行うにはどうすればよいですか? 私は次のようになりました:

var request = require("request");
request("http://www.myawesomepage.com/", function (error, response, body) {
    /*
     Something here that lets me access the text
     outside of the closure

     This doesn't work:
     this.text = body;
    */ 
})
4

3 に答える 3

10
var request = require("request");

var parseMyAwesomeHtml = function(html) {
    //Have at it
};

request("http://www.myawesomepage.com/", function (error, response, body) {
    if (!error) {
        parseMyAwesomeHtml(body);
    } else {
        console.log(error);
    }
});

編集:Kishoreが指摘したように、利用可能な解析のための優れたオプションがあります。Windowsのjsdomでpython/gypの問題が発生した場合は、cheerioも参照してください。githubのCheerio

于 2012-07-07T00:46:16.247 に答える
3

そのrequest()呼び出しは非同期であるため、応答はコールバック内でのみ利用できます。そこから解析関数を呼び出す必要があります。

function parse_my_awesome_html(text){
    ...
}

request("http://www.myawesomepage.com/", function (error, response, body) {
    parse_my_awesome_html(body)
})

コールバックの連鎖に慣れてください。これは基本的に、JavaScriptでI / Oが発生する方法です:)

于 2012-07-07T01:36:48.267 に答える
2

応答を解析したい場合、JsDomはこのようなことを達成するのに非常に適しています。

    var request = require('request'),
    jsdom = require('jsdom');

request({ uri:'http://www.myawesomepage.com/' }, function (error, response, body) {
  if (error && response.statusCode !== 200) {
    console.log('Error when contacting myawesomepage.com')
  }

  jsdom.env({
    html: body,
    scripts: [
      'http://code.jquery.com/jquery-1.5.min.js'
    ]
  }, function (err, window) {
    var $ = window.jQuery;

    // jQuery is now loaded on the jsdom window created from 'agent.body'
    console.log($('body').html());
  });
});

また、ページに多数の javascript/ajax コンテンツが読み込まれている場合は、phantomjsの使用を検討してください ソースhttp://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs/

于 2012-07-07T00:42:17.167 に答える