2016-08-10 7 views
0

こんにちはみんな、これは私の最初の質問はここstackoverflowので、私には非常に難しくはありません..しかし、w/e:P。 私は問題があります.. 私はまったく新しいものです。私は問題を抱えています。私は正しい要素を選択できません。私のコードは次のようになります。Cheerioダイレクト子セレクタ

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のanwserのおかげで、私は最初の問題を解決することができましたが、私は身体の直後に子供を直接選択しなければならないので、tbodyとしてバグがあるようです... any1は回避策を得ましたか?

答えて

1

オリジナル:私の知る限りチェリオ最後に使用したとき、私は(覚えているよう

時間)tbodyはcheerioで認識されません、そのまま残して、代わりにこれを使用してください:

テーブル> 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); 
+0

うわー、うまくいくようです:お元気ですか?例えばbody> div:last-of-typeも失敗しているようです –

+0

私はちょっと遊びましたが時にはうまくいきませんでした。user3366016詳細な調査を参照してください – John

1

アップデート:@のlogolの応答に基づいて

、私はdocs for Cheerioをチェックし、それはそのセレクタがCSSSelectライブラリ上に構築されていると言います。それらのdocsにセレクタのリストがあります。子セレクタと親セレクタがサポートされていますが、それはすべての要素セレクタも含意しているようです。しかし、このg ithub issueはtbodyの問題にフラグを立てます。

オリジナル:

あなたのセレクターとどのようにコンソールでそれをプリントアウトしているに記載されている重複したテーブルを持つことを意味します。

これを試してみてください:

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

Webページ上のこのの出力は次のとおりです。

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

おかげでこれを試しますあなたがしたい場合は、問題をuは、URLを調べることができませんでした。あらゆる直接的な選択のために私のために起こります。たぶんこれは悪い選択でしたが、私がurの選択を使うとNULLになってしまいます。 jquery yesの –

+0

です。しかし、私が言ったように私はウェブを掻き集めるためにcheerioを使用しました –

+0

@logolは何かにありました:)私はそうではありませんでした。私はいくつかのドキュメントとgithub問題に同じtbodyの問題を追加しました。 – user3366016