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 解析器传递给第二个函数?现在解析器是文件中的全局变量。

我已经尝试了一堆这样的随机事情,但它们也不起作用:

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 现在是 aselector Object并且将有一个.find()可以调用的方法。

在 Jquery(我不太确定 Cheerio)中, theselector 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 回答