因此,基本上,我正在制造一个Chrome扩展程序,该扩展程序按其受欢迎程度(售出次数)对Ebay上的搜索结果进行排序。为此,我需要找到所有具有包含文本li
的后代文本节点的...+ Sold
元素,其中...
是数字。
基本上,在Ebay上的搜索结果如下:
<li class="s-item">
<div class="s-item__wrapper clearfix">
<div class="s-item__image-section">
<!-- other stuff -->
</div>
<div class="s-item__info clearfix">
<!-- other stuff -->
<div class="s-item__details clearfix">
<!-- other stuff -->
<div><span><span>62+ Sold</span></span></div>
</div>
</div>
</div>
</li>
在每个li
元素中,我必须搜索文本Sold
并从该文本节点中提取数字以进行进一步处理。我该怎么办?
答案 0 :(得分:1)
使用选择器字符串:选择ProductBasicProjection
以选择所有从li.s-item span
派生为span
的{{1}}的对象,检查跨度是否是唯一的孩子是一个文本节点,其中带有“已售出”字样,如果是,请执行您需要做的任何事情。
如果您确定任何 li
,而不只是那些具有s-item
类的人,请改用<li>
:>
s-item
'li span'
答案 1 :(得分:1)
您不能仅通过使用childNodes
或children
属性来执行此操作,因为它们仅返回子节点,而不返回当前节点的所有后代。因此,您将必须为此编写自己的函数,例如:
function getDescendants(node, arr) {
var i;
arr = arr || [];
for (i = 0; i < node.childNodes.length; i++) {
arr.push(node.childNodes[i])
getDescendants(node.childNodes[i], arr);
}
return arr;
}
使用此功能,您只需简单地遍历所有后代并检查它们是否为文本节点(nodeType == 3
),然后在其中搜索单词Sold
。之后,提取数字非常容易。
像这样:
var searchValue = "Sold";
var descendants = getDescendants(listItem);
for(var j = 0; j < descendants.length; j++) {
if(descendants[j].nodeType == 3){
if(descendants[j].nodeValue.indexOf(searchValue) > -1){
var text = descendants[j].nodeValue.trim();
//"37+ Sold" for example
var soldNr = text.substring(0, text.indexOf(searchValue)-2);
//you process your number(soldNr) further
}
}
}