2017-07-13 1 views
0

私はcheerioでテーブルからデータを抽出しようとしています。ここ は簡略化されたバージョンである:cheerioで表を解析する

const table = ` 
 
    <table> 
 
    <tr> 
 
     <td></td> 
 
     <td class="with-link"><a href="www.foo.bar"></a></td> 
 
    </tr> 
 
    </table> 
 

 
` 
 

 
const row = `<td><a href="www.foo.bar"></a></td>` 
 

 
class Scraper { 
 
    htmlToDom(html) { 
 
    return cheerio.load(html) 
 
    } 
 
    findHref(row) { 
 
    return row('a').attr('href') 
 
    } 
 
} 
 

 
const scraper = new Scraper() 
 
const cheerioRow = scraper.htmlToDom(row) 
 
console.log(scraper.findHref(cheerioRow)) 
 

 
const cheerioTable = scraper.htmlToDom(table) 
 
cheerioTable('tr').each(function() { 
 
    //console.log(this) 
 
    let td = this.find('td.with-link') 
 
    console.log(scraper.findHref(td)) 
 

 
})
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <script src="https://wzrd.in/standalone/[email protected]"></script> 
 
    <title>JS Bin</title> 
 
</head> 
 

 
<body> 
 

 
</body> 
 

 
</html>

スクレーパークラスには2つのメソッドがあり、一つは、HTML(文字列)をロードし、チェリオオブジェクトを返すことができます。もう1人は(cheerio)オブジェクトを予期し、そこからhrefを返します。

最初のコンソールログには、findHrefが正常に動作することが示されています。次に、テーブル全体をロードし、その行をループします(この場合は1つだけです)。 eachループthisの内側には、roe(tr)オブジェクトが必要です。私は正しいセル(クラス 'with-link')を見つけようとして、それをfindHrefに渡します。

しかし、私は念のため

"TypeError: this.find is not a function

を取得しています、ここJsBinです:https://jsbin.com/vakofapiro/edit?js,console

答えて

0

の代わりにこの使用cheerioTable。

`let td = cheerioTable(this).find('td.with-link').html();` 

それはあなたにそれは多分、この例では動作しますが、はそれでテキストを持っているものならば

+0

のhrefあるTDの内部HTMLを与えるだろう。私が望むのは、cheerio tdオブジェクトをscraperのfindHrefメソッドに渡すことです。これは簡単な例です私のアプリではfindHrefメソッドははるかに多く、tdももっと複雑です。 – user3568719

関連する問題