我尝试从带有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/cheerio@latest"></script>
<title>JS Bin</title>
</head>
<body>
</body>
</html>
Scraper类有两个方法,一个可以加载html(string)并返回一个cheerio对象。另一个期望一个(cheerio)td对象,并从中返回href。
第一个控制台日志显示findHref
按预期工作。然后我加载一个整个表,遍历它的行(在这种情况下只有一个)。 each
循环this
内部应该是一个roe(tr)对象。我尝试找到正确的单元格(带有'with-link'类),并将其传递给findHref
。
但我得到了
“TypeError:this.find不是函数
以防万一,这里是JsBin:https://jsbin.com/vakofapiro/edit?js,console
答案 0 :(得分:0)
而不是使用cheerioTable。
Restrict_Run
它将为您提供td的内部html,这是一个href