我认为这可能只是基本语法。我是来自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全部创建,所以很多孩子都是空白)< / p>
答案 0 :(得分: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']
个元素。