Cheerio直接儿童选择器

时间:2016-08-10 18:04:56

标签: javascript jquery web-scraping request cheerio

嘿伙计和女士首先这是我在stackoverflow中的第一个问题,所以不要对我这么难..但是没有:P。 我有个问题.. 我是网络抓取的新手,目前我遇到了无法选择正确元素的问题。我的代码如下所示:

var express = require('express');
var path = require('path');
var request = require('request');
var cheerio = require('cheerio');
var fs = require('fs');

var app = express();
var port = 8000;

var url = "http://www.finanzparasiten.de/html/links/awd.html";

request(url, function (err, resp, body) {
    if(!err) {
        var $ = cheerio.load(body)

        var test = $('body table table table > tbody > tr > td > p');
        console.log(test.html())   
        test.each(function (ii, asdf) {
            var rr = $(asdf).find("table").find("tr").first().find('td:nth-child(2)').text();
            console.log(asdf);
        }) 
    } else {
        console.log("we encountered an error: " + err);
    }
});

app.listen(port);
console.log('server is listening on ' + port);

它为变量测试保持NULL。 似乎cheerio与>有问题。选择。使用jQuery,这个选择将按预期工作。

感谢@ logol&an; swser我可以解决第一个问题,但现在我面临的问题是我必须在身体之后选择直接的孩子,它似乎是错误的tbody .. any1有一个解决方法?

2 个答案:

答案 0 :(得分:2)

<强>原始

据我记得(当我最后一次使用cheerio时)tbody在cheerio中无法识别,只需离开它并使用它:

表&gt; tr> TD

PS:thead正在工作

<强>更新

有时即使使用tbody也可以工作,请在REPL中尝试此操作

const cheerio = require('cheerio');
const html = '\
<!DOCTYPE html>\
<html>\
  <head>\
    <title>Cheerio Test</title>\
  </head>\
  <body>\
    <div id="#1">\
      <table>\
        <thead>\
          <tr>\
            <th>Month</th>\
            <th>Savings</th>\
          </tr>\
        </thead>\
        <tfoot>\
          <tr>\
            <td>Sum</td>\
            <td>180</td>\
          </tr>\
        </tfoot>\
        <tbody>\
          <tr>\
            <td>January</td>\
            <td>100</td>\
          </tr>\
          <tr>\
            <td>February</td>\
            <td>80</td>\
          </tr>\
        </tbody>\
      </table>\
    </div>\
  </body>\
</html>';
const dom = cheerio.load(html);

// not working:
let tds1 = dom('div#1 > table > tbody > tr > td').map(function () {
  return dom(this).text().trim();
}).get();

// working:
let tds2 = dom('table > tbody > tr > td').map(function () {
  return dom(this).text().trim();
}).get();

// not working:
let tds3 = dom('div#1 > table > tr > td').map(function () {
  return dom(this).text().trim();
}).get();

console.log(tds1);
console.log(tds2);
console.log(tds3);

答案 1 :(得分:1)

<强>更新

根据@ logol的回复,我检查了docs for Cheerio,并说其选择器是基于CSSSelect库构建的。他们的docs有一个选择器列表。支持子和父选择器,它似乎暗示所有元素选择器也是如此。但是,这个g ithub issue标记了tbody问题。

<强>原始

您的意思是让选择器中列出重复的表格,以及如何在控制台中将其打印出来。

试试这个:

var test = $('body table > tbody > tr > td > p');
console.log(test.innerHTML)

网页上的输出是:

<span class="TDheadlinebig">AWD - Allgemeiner
                Wirtschaftsdienst</span><span class="TDnormal"><br>
                </span><span class="TDheadlinenormal">zweitgrößte "Strukkibude"
                </span><span class="TDnormal"><br>
                </span>