如何用CSS选择器提取td内纯问题文本(排除子标签内容)
提取表格td中的纯问题文本(排除子标签内容)
你的问题出在:之前的选择器只是选中了td元素,但td的默认文本内容会包含所有子标签(、等)里的文字,所以需要针对性提取td下未被任何子标签包裹的直接文本节点。
下面是两种可行的实现方法:
方法一:遍历文本节点筛选
直接遍历td的所有子节点,只保留纯文本节点的内容,过滤掉元素节点:
document.querySelectorAll('#s1234 tr > td').forEach(td => { let questionText = ''; td.childNodes.forEach(node => { // nodeType为3代表文本节点 if (node.nodeType === 3) { const trimmed = node.textContent.trim(); if (trimmed) questionText += trimmed; } }); console.log(questionText); });
运行后会输出:
question1 question2。
如果不需要末尾的句号,可以追加questionText = questionText.replace(/。$/, '')做进一步处理。
方法二:克隆元素并移除子节点
通过克隆td元素,删除所有子元素后,剩下的就是纯问题文本:
document.querySelectorAll('#s1234 tr > td').forEach(td => { const clone = td.cloneNode(true); // 移除所有子元素(<i>、<a>、<q>等) while (clone.firstElementChild) { clone.removeChild(clone.firstElementChild); } const questionText = clone.textContent.trim(); console.log(questionText); });
为什么之前的方法无效?
#s1234 tr > td:not(i) 这个选择器的作用是选中不是标签的td元素,但td本身包含等子标签,所以获取td的textContent时,依然会把子标签内的文字一并包含进去,并没有达到过滤子标签内容的目的。
内容的提问来源于stack exchange,提问作者Relaxing
相关产品推荐
相关产品推荐

