1

これは単なる基本的な構文かもしれないと思います。私は Java 出身で、Javascript は初めてです。たとえば、すべての例で $ を見ると頭が真っ白になります。

HTTP リクエスト (たくさんのドッグ ショーを含む) を解析するためのコードは、(リクエスト ライブラリを使用して) 次のようになります。

function parseRequest1(error, response, body) {
    // TODO  should check for error...
    var Cheerio = require('cheerio');
    parser = Cheerio.load(body);

    var table2 = parser('.qs_table[bgcolor="#71828A"]');
    var showList = [];

    // skip over a bunch of crap to find the table.  Each row with this BG color represents a dog show
    var trows = parser('tr[bgcolor="#FFFFFF"]', table2);
    trows.each(function(i, tablerow) {
        var show = parseShow(tablerow);
        if (show)  // returns a null if something went wrong
            showList.push(show);
    });

    // then do something with showList...

}

によって呼び出されます

Request.get(URL, parseRequest1);

ここまでは順調ですね。私が立ち往生しているのは、parseShow 関数の書き方です。私は何かに行きたいです

function parseShow(tableRow) {
    var tds = parser('td', tableRow);
    //and then go through the tds scraping info...
}

しかし、私はエラーが発生します:

TypeError: Object #<Object> has no method 'find'
    at new module.exports (C:\Users\Morgan\WebstormProjects\agility\node_modules\cheerio\lib\cheerio.js:76:18)
    at exports.load.initialize (C:\Users\Morgan\WebstormProjects\agility\node_modules\cheerio\lib\static.js:19:12)
    at parseShow (C:\Users\Morgan\WebstormProjects\agility\routes\akc.js:20:15)

スタック トレースを見ると、Cheerio が新しいものを作成しているように見えます。Cheerio パーサーを 2 番目の関数に渡すにはどうすればよいですか? 現在、パーサーはファイル内のグローバル変数です。

私はこれらのようなランダムなことをたくさん試しましたが、どちらも機能しません:

var tds = tableRow('td');
var tds = Cheerio('td', tableRow);

代わりに私がしなければならないのは、一連の嫌な、壊れやすいコードへのアクセスtableRow.children[1], tableRow.children[3]などです...(HTMLには /r/ns が作成されているため、多くの子は空白です)

4

1 に答える 1

2

についてのあなたの言いたいことはわかります$(..)。$ は単なる関数名です。短くて目を引くので選ばれたと思います。

Cheerio、より一般的には JQuery で使用され、css セレクターで使用されます。

var table2 = $('.qs_table[bgcolor="#71828A"]');

これの利点は、table2 がになり、呼び出すことができるメソッドをselector Object持つようになることです。.find()

Jquery(Cheerioについてはよくわかりません)では、selector Objectもコレクションであるため、複数の要素を一致させることができます(または一致しません)。

JavaScript のオブジェクト モデルは Java よりもはるかに動的であるため、コードがより短くなる可能性があります。

テーブル行を解析するコード:

 $('tr[bgcolor="#FFFFFF"]').each(function(i, tablerow) {
    var show = tablerow.text();
    if (show)  // returns a null if something went wrong
        showList.push(show);
 });

上記のコードparser(..)では、 ではなく が使用されています$(..)。ただし、一度オブジェクトに本体がロードされると、そのまま使用し続けることができます。

parser('tr[bgcolor="#FFFFFF"]').each(function(i, tablerow) {

または、次のようにしたいテーブルの行を見つけるだけです:

parser('.qs_table[bgcolor="#71828A"] tr[bgcolor="#FFFFFF"]').each(function(i, tablerow) {

セレクターは css であるため、要素tr[bgcolor="#FFFFFF"]の子であるすべての要素が検索されます.qs_table[bg="#71828A']

于 2013-10-26T19:02:22.487 に答える