我正在使用jQuery(好吧,cheerio)从html表中抓取数据。我正在尝试显示单元格中具有文本和图像的一列中的数据,但我只希望它显示文本。
例如,表看起来像:
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
[当我这样选择:$(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。
如何获取仅选择data 1-1
而未包含img或该行的其余部分?
我对jQuery非常陌生,因此一直很难。抱歉,如果已经问过这个问题,我什么都找不到...为了简化起见,我省略了一些代码,但是如果您想查看整个功能,请告诉我]
更新:答案
感谢Roko的帮助,这是使用我的完整代码实现的解决方案:
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");
$('.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 或:eq()
获取特定的行索引,而不是特定的单元格索引。
示例获得TBODY的第一个TR .eq()
method和它的第一个TD .eq()
的.text()
:eq(0)
:eq(0)
要获得第二行的第一个单元格,只需使用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>
。依此类推