使用 Cheerio 从页面 td 元素中提取文本
Extracting text from page td element with Cheerio
此 Meteor 服务器代码使用 Cheerio/jQuery 从包含以下 html;[=15= 的网页中的第六个 td
元素获取值“44 年” ]
它给出了未定义的,知道怎么做吗?谢谢
<tr>
<td class="label" style="white-space:nowrap">Nmae:</td>
<td> </td>
<td colspan="2" class="bodyText">male</td>
<td colspan="2" class="label">Age:</td>
<td class="bodyText" width="1%"> </td>
<td colspan="2" class="bodyText">44 years</td> <--------------
</tr>
$('td[class=label]').each((i, elem) => { //<------ $ is cheerio object
let str = elem.innerHTML;
console.log(str); //<---------- undefined
if (str === '44 years') {
console.log('found it');
let age = elem.nextSibling.nextSibling.innerHTML;
console.log(age);
return false;
}
});
如果您想检索最后一列值,即 44 并对其添加检查,请尝试使用此代码。您可以在 if loop
中编写您的逻辑
table.find('tr').each(function (i, elem){
var $tds = $(this).find('td');
var str= $tds.eq(5).text();
console.log(str); //<-- last column value
if (str === '44 years') {
console.log('found it');
// write your code here
}
});
在这里这个选择器:
$('td[class=label]').each((i, elem) => {
实际上是说 "Cycle every TD DOM elements which has the class label",在您的 HTML 中,唯一会循环的列是姓名和年龄:
<td class="label" style="white-space:nowrap">Nmae:</td>
<td colspan="2" class="label">Age:</td>
因此,当您执行此代码时:
let str = elem.innerHTML;
if (str === '44 years') {
它永远不会进入 "if statement",因为它们循环的唯一列没有“44 年”,它们将只有 "Nmae:" 和 "Age:"。
我还注意到您将 HTML 元素的 class 属性放在第一位,然后放在 "colspan" 属性之后的第二个元素上,当您写你的代码。
所以解决方案是将选择器更改为循环遍历每个元素,如下所示:
//Select all "td" within "tr"
// vvv
$('tr td').each((i, elem) => { //<------ $ is cheerio object
let str = elem.innerHTML;
console.log(str); //<---------- undefined
if (str === '44 years') {
console.log('found it');
let age = elem.nextSibling.nextSibling.innerHTML;
console.log(age);
return false;
}
});
如果你这样保留它,它会找到年份,但它也会抛出错误,因为最后一个 "td" 元素会寻找它的兄弟姐妹,但它们是 none,因为它是最后一个元素。
因此,如果您已经找到它,那么您只需显示找到后的元素,如下所示:
//Select all "td" within "tr"
// vvv
$('tr td').each((i, elem) => {
let str = elem.innerHTML;
console.log(str); //<---------- String for each column
if (str === '44 years') {
console.log('found it');
let age = elem;
console.log(age);
return false;
}
});
希望对您有所帮助。
狮子座。
此 Meteor 服务器代码使用 Cheerio/jQuery 从包含以下 html;[=15= 的网页中的第六个 td
元素获取值“44 年” ]
它给出了未定义的,知道怎么做吗?谢谢
<tr>
<td class="label" style="white-space:nowrap">Nmae:</td>
<td> </td>
<td colspan="2" class="bodyText">male</td>
<td colspan="2" class="label">Age:</td>
<td class="bodyText" width="1%"> </td>
<td colspan="2" class="bodyText">44 years</td> <--------------
</tr>
$('td[class=label]').each((i, elem) => { //<------ $ is cheerio object
let str = elem.innerHTML;
console.log(str); //<---------- undefined
if (str === '44 years') {
console.log('found it');
let age = elem.nextSibling.nextSibling.innerHTML;
console.log(age);
return false;
}
});
如果您想检索最后一列值,即 44 并对其添加检查,请尝试使用此代码。您可以在 if loop
中编写您的逻辑 table.find('tr').each(function (i, elem){
var $tds = $(this).find('td');
var str= $tds.eq(5).text();
console.log(str); //<-- last column value
if (str === '44 years') {
console.log('found it');
// write your code here
}
});
在这里这个选择器: $('td[class=label]').each((i, elem) => {
实际上是说 "Cycle every TD DOM elements which has the class label",在您的 HTML 中,唯一会循环的列是姓名和年龄:
<td class="label" style="white-space:nowrap">Nmae:</td>
<td colspan="2" class="label">Age:</td>
因此,当您执行此代码时:
let str = elem.innerHTML;
if (str === '44 years') {
它永远不会进入 "if statement",因为它们循环的唯一列没有“44 年”,它们将只有 "Nmae:" 和 "Age:"。
我还注意到您将 HTML 元素的 class 属性放在第一位,然后放在 "colspan" 属性之后的第二个元素上,当您写你的代码。
所以解决方案是将选择器更改为循环遍历每个元素,如下所示:
//Select all "td" within "tr"
// vvv
$('tr td').each((i, elem) => { //<------ $ is cheerio object
let str = elem.innerHTML;
console.log(str); //<---------- undefined
if (str === '44 years') {
console.log('found it');
let age = elem.nextSibling.nextSibling.innerHTML;
console.log(age);
return false;
}
});
如果你这样保留它,它会找到年份,但它也会抛出错误,因为最后一个 "td" 元素会寻找它的兄弟姐妹,但它们是 none,因为它是最后一个元素。
因此,如果您已经找到它,那么您只需显示找到后的元素,如下所示:
//Select all "td" within "tr"
// vvv
$('tr td').each((i, elem) => {
let str = elem.innerHTML;
console.log(str); //<---------- String for each column
if (str === '44 years') {
console.log('found it');
let age = elem;
console.log(age);
return false;
}
});
希望对您有所帮助。
狮子座。