jQuery 存在图像时仅从 table 单元格中选择文本时出现问题
jQuery problem selecting text only from table cell when there is an image
我正在使用 jQuery(好吧,cheerio)从 html table 中抓取数据。我正在尝试显示单元格中包含文本和图像的一列中的数据,但我只希望它显示文本。
例如 table 看起来像:
col 1 | col 2 | col 3
---------------------------------------
data 1-1 [img] | data 1-2 | data 1-3
data 2-1 [img] | data 2-2 | data 2-3
data 3-1 [img] | data 3-2 | data 3-3
data 4-1 [img] | data 4-2 | data 4-3
当我 select 这样:$(this).children().next().text()
它输出该行中的所有内容,如下所示:data 1-1 data 1-2 data 1-3
它在我执行 $(this).children().next().html()
时有效,但输出是这样的:data 1-1 <img src="blah.jpg">
,显然是因为它在该列中包含图像的 html。
如何在不包括 img 或该行的其余部分的情况下仅将其设置为 select data 1-1
?
我是 jQuery 的新手,所以我在这方面遇到了困难。抱歉,如果已经有人问过这个问题,我找不到任何相关信息...为了简单起见,我省略了一些代码,但如果您想查看整个函数,请告诉我
更新:回答
感谢 Roko 的帮助,这是用我的完整代码实现的解决方案(我使用 .eq(0)
而不是 tr:eq(0)
,因为我使用的是 cheerio)
router.get("/scrape", function(req, res){
request("http://link-goes-here", function(error, response, html){
var $ = cheerio.load(html);
var storeInfo = [];
$("body > table > tbody > tr > td:nth-child(1) > table").addClass("row");
//loop through selected table only where tr = "QA1"
$('.row > tbody > tr:contains("QA1")').each(function(i, element){
var result = {
"environment" : $(this).children().next().eq(0).text(),
"store" : $(this).children().next().next().html(),
"version" : $(this).children().next().next().next().html()
};
storeInfo.push(result);
});
});
res.redirect("/stores");
});
您可以使用 :eq()
selector or the .eq()
method 获取特定的行索引,而不是特定的单元格索引。
示例 获取 TBODY 的第一个 TR :eq(0)
及其第一个 TD :eq(0)
的 .text()
const val = $("#someTable").find("tbody tr:eq(0) td:eq(0)").text();
console.log(val); // "data 1-1"
<table id="someTable">
<thead>
<tr><th>Col 1</th><th>Col 2</th><th>Col 3</th></tr>
</thead>
<tbody>
<tr><td>data 1-1 <img src="//placehold.it/50x50"></td><td>data 1-2</td><td>data 1-3</td></tr>
<tr><td>data 2-1 <img src="//placehold.it/50x50"></td><td>data 2-2</td><td>data 2-3</td></tr>
<tr><td>data 3-1 <img src="//placehold.it/50x50"></td><td>data 3-2</td><td>data 3-3</td></tr>
<tr><td>data 4-1 <img src="//placehold.it/50x50"></td><td>data 4-2</td><td>data 4-3</td></tr>
</tbody>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
要获取第二行的第一个单元格,只需使用 tr:eq(1)
和 td:eq(0)
。等等
我正在使用 jQuery(好吧,cheerio)从 html table 中抓取数据。我正在尝试显示单元格中包含文本和图像的一列中的数据,但我只希望它显示文本。
例如 table 看起来像:
col 1 | col 2 | col 3
---------------------------------------
data 1-1 [img] | data 1-2 | data 1-3
data 2-1 [img] | data 2-2 | data 2-3
data 3-1 [img] | data 3-2 | data 3-3
data 4-1 [img] | data 4-2 | data 4-3
当我 select 这样:$(this).children().next().text()
它输出该行中的所有内容,如下所示:data 1-1 data 1-2 data 1-3
它在我执行 $(this).children().next().html()
时有效,但输出是这样的:data 1-1 <img src="blah.jpg">
,显然是因为它在该列中包含图像的 html。
如何在不包括 img 或该行的其余部分的情况下仅将其设置为 select data 1-1
?
我是 jQuery 的新手,所以我在这方面遇到了困难。抱歉,如果已经有人问过这个问题,我找不到任何相关信息...为了简单起见,我省略了一些代码,但如果您想查看整个函数,请告诉我
更新:回答
感谢 Roko 的帮助,这是用我的完整代码实现的解决方案(我使用 .eq(0)
而不是 tr:eq(0)
,因为我使用的是 cheerio)
router.get("/scrape", function(req, res){
request("http://link-goes-here", function(error, response, html){
var $ = cheerio.load(html);
var storeInfo = [];
$("body > table > tbody > tr > td:nth-child(1) > table").addClass("row");
//loop through selected table only where tr = "QA1"
$('.row > tbody > tr:contains("QA1")').each(function(i, element){
var result = {
"environment" : $(this).children().next().eq(0).text(),
"store" : $(this).children().next().next().html(),
"version" : $(this).children().next().next().next().html()
};
storeInfo.push(result);
});
});
res.redirect("/stores");
});
您可以使用 :eq()
selector or the .eq()
method 获取特定的行索引,而不是特定的单元格索引。
示例 获取 TBODY 的第一个 TR :eq(0)
及其第一个 TD :eq(0)
.text()
const val = $("#someTable").find("tbody tr:eq(0) td:eq(0)").text();
console.log(val); // "data 1-1"
<table id="someTable">
<thead>
<tr><th>Col 1</th><th>Col 2</th><th>Col 3</th></tr>
</thead>
<tbody>
<tr><td>data 1-1 <img src="//placehold.it/50x50"></td><td>data 1-2</td><td>data 1-3</td></tr>
<tr><td>data 2-1 <img src="//placehold.it/50x50"></td><td>data 2-2</td><td>data 2-3</td></tr>
<tr><td>data 3-1 <img src="//placehold.it/50x50"></td><td>data 3-2</td><td>data 3-3</td></tr>
<tr><td>data 4-1 <img src="//placehold.it/50x50"></td><td>data 4-2</td><td>data 4-3</td></tr>
</tbody>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
要获取第二行的第一个单元格,只需使用 tr:eq(1)
和 td:eq(0)
。等等