jQuery 访问站点中的 DOM
Posted
技术标签:
【中文标题】jQuery 访问站点中的 DOM【英文标题】:jQuery to access DOM in a site 【发布时间】:2014-10-28 18:35:15 【问题描述】:我正在尝试从site 中抓取表格中的各种元素,以自学使用 node.js、cheerio 和 request 进行抓取
我在获取表格中的项目时遇到问题,基本上我想从表格中获取“排名”、“公司”和“3 年增长”。我该怎么做?
基于在线tutorial,我开发了我的 scraping.js 脚本,如下所示:
var request = require ('request'),
cheerio = require ('cheerio');
request('http://www.inc.com/inc5000/index.html', function (error, response, html)
if (!error && response.statusCode == 200)
var $ = cheerio.load(html);
$('tr.ng-scope').each(function(i, element) //problem probably lies here
var a = $(this).get(0);
console.log(a);
);
);
但是,我确定我没有得到上面正确的评论。有没有办法更好地访问表中的属性?
我注意到 Xpath 就是这样
//*[@id="col-r"]/table/tbody/tr2/td1 -- 排名
//*[@id="col-r"]/table/tbody/tr2/td2/a -- 公司名称
//*[@id="col-r"]/table/tbody/tr2/td[3] -- 3年增长率
只是想弄清楚如何相应地访问这些属性..
【问题讨论】:
【参考方案1】:你在正确的轨道上。
$().get()
方法返回元素。在您的情况下,var a
是TR
。这不一定是你想要的。
您需要做的是进一步将每一行细分为单独的TD
。我使用$(this).find('td')
做到了这一点。然后,我逐个抓取每个TD
并从中提取文本,将其转换为一个对象,其中键代表表的字段。所有这些都聚合到一个数组中,但是您可以使用基本概念来构建您认为适合使用的任何数据结构。
request('http://www.inc.com/inc5000/index.html', function (error, response, html)
if(error || response.statusCode != 200) return;
var $ = cheerio.load(html);
var DATA = [];
$('tr.ng-scope').each(function()
var $tds = $(this).find('td');
DATA.push(
rank: $tds.eq(0).text(),
company: $tds.eq(1).text(),
growth: $tds.eq(2).text(),
revenue: $tds.eq(3).text(),
industry: $tds.eq(4).text()
);
);
console.log(DATA);
);
【讨论】:
谢谢,当我运行这段代码时,我只是得到 [] 作为输出。使用console.log(DATA.length),我得到0。有什么我可以纠正的吗?理想情况下,我想显示属性.. 听起来 $('tr.ng-scope') 选择器没有找到任何东西。 这可能与我的 DATA 变量的范围有关。我更新了代码以将其本地化为回调。试一试@stretchr。 我不确定变量中是否存储了任何内容,尝试执行 console.log($tds.eq(0).text());在 var tds 下,控制台中没有打印任何内容.. 做一个console.log( $('tr.ng-scope').length )
。就像我之前说的,听起来它甚至没有进入每个循环。如果确实有长度,那么请console.log( $tds.length )
。以上是关于jQuery 访问站点中的 DOM的主要内容,如果未能解决你的问题,请参考以下文章