【问题标题】:Scraping subelements in HTML using jQuery?使用 jQuery 在 HTML 中抓取子元素?
【发布时间】:2011-10-30 07:30:23
【问题描述】:

我目前正在编写一个脚本来从 HTML 页面中抓取一些非常基本的信息。具体来说,我正在尝试从 allmusic.com 获取有关艺术家的一些信息。我正在使用 jQuery 在 node.js 中编写这个脚本来进行实际的抓取,并通过使用来自this blog post 的示例使其在一定程度上工作。

我要做的是搜索一位受欢迎的艺术家,然后在第一个结果中存储一些基本信息,这几乎完全是我正在寻找的艺术家。我可以使用下面的代码提取有问题的表格,但我不知道如何从 HTML 中获取前几个 td 元素,这是我真正需要做的。我的node.js代码如下:

var request = require('request'),
    jsdom = require('jsdom');

request({ uri:'http://allmusic.com/search/artist/lady+gaga' }, function (error, response, body) {

  jsdom.env({
    html: body,
    scripts: [
      'http://code.jquery.com/jquery-1.5.min.js'
    ]
  }, function (err, window) {
    var $ = window.jQuery;

    // jQuery is now loaded on the jsdom window created from 'agent.body'
    var search = $('.search-results').html();
    if(search != null){
      //gah what can i do here?!?
    }
  });
});

下面是有问题的 HTML 块,所以你不需要自己去寻找它:

<table class="search-results" border="0" cellpadding="0" cellspacing="0" width="100%">
   <tr>
      <th class="relevance">
          <a href="http://www.allmusic.com/search/artist/lady gaga/filter:all/exact:0/order:relevance-asc" title="order by relevance">Relevance</a>
      </th>
      <th width="10px">&nbsp;</th>

      <th>
         <a href="http://www.allmusic.com/search/artist/lady gaga/filter:all/exact:0/order:name-asc" title="order by name">Name</a>
      </th>
      <th width="75px">
          <a href="http://www.allmusic.com/search/artist/lady gaga/filter:all/exact:0/order:genre-asc" title="order by genre">Genre</a>
       </th>
       <th width="200px">Years Active</th>

    </tr>

           ACTUAL RELEVANT STUFF THAT I WANT ARE BELOW

    <tr>
       <td class="relevance text-center">
           <div class="bar" style="width:100%" title="100%"></div>
       </td>
       <td class="text-center"></td>
       <td><a href="http://www.allmusic.com/artist/lady-gaga-p1055684">Lady Gaga</a></td>

        <td>Pop/Rock</td>   //SPECIFICALLY THIS
        <td>00s</td>
    </tr>

此表中有更多条目,但这是第一个结果。是否可以创建一个 td 数组或类似的东西并获得正确的索引?假设我总是会得到第一个结果,那么每个艺术家的索引应该是相同的。

如果这不可能,还有其他方法可以实现我的目标吗?或者,有没有更好的方法来做我想要用 node.js 做的事情?我查看了一堆不同的选项,这似乎是最简单的。

最好的,谢谢,
萨米

【问题讨论】:

    标签: jquery node.js jquery-selectors screen-scraping web-scraping


    【解决方案1】:

    可以使用 .siblings() 方法遍历 td 元素。

    见:http://api.jquery.com/siblings/ 您还可以使用 JQuery 获取所有 td 元素,这些元素将返回一个数组并使用您提到的索引。

    选择器应该是这样的:

    var tds= $('.search-results tr td');
    

    这将获得表中的所有 td,因此您必须乘以列数。

    var trs = $('.search-results tr');
    

    请记住,第一列包含标题,而那些不在 tds 变量中。

    希望对您有所帮助。

    【讨论】:

    • 嗨 theprogrammer(或其他任何人) - 所以当我执行var tds= $('.search-results tr td'); 之类的操作时,我总能看到与此匹配的第一个元素(&lt;div class="bar" style="width:100%" title="100%"&gt;&lt;/div&gt;),但我无法弄清楚如何访问任何 td 之后...我尝试使用数组表示法并使用我在 jQuery API 中找到的一些函数(即链接到 children() 的调用和siblings()),但我似乎什么都做不了......我假设我缺少一些明显的东西......
    • 好的,所以我已经想出了如何使用each 函数来做到这一点。但是,理想情况下,我只想选择一个我想跳转到的索引,而不需要在此之前遍历所有索引。有人能启发我如何做到这一点吗?
    • tds[0] 将返回该位置的 html 对象。你应该能够做到 $(tds[2]).text();例如获取文本内容。
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多