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 aTR。这不一定是你想要的。

您需要做的是进一步将每一行细分为单独的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的主要内容,如果未能解决你的问题,请参考以下文章

用于 jQuery 站点的简单 Azure 表服务前端

复习DOMJQuery

返回 Jquery 站点主页时无法访问脚本

最小化 jquery.append 重站点的 DOM 访问

jQuery的9中构造函数

jQuery 遍历(上)