递归获取父元素。
https://github.com/shancw96/chrome_extensions/tree/master/webCrawer_hepler
/**
* 获取当前节点的所有父节点
* @param {HTMLDOM} node 节点
* @param {Array} resArr 结果数组
*/
const getAllParentNode = (node, resArr = []) => node.tagName === 'BODY' ? resArr : getAllParentNode(node.parentNode, [node, ...resArr])
/**
* 点击后获取 cheerio 爬虫格式 当前节点定位
* @param {HTML event} e
*/
const locateClickedDOM = e => {
e.preventDefault()
const nodeArr = getAllParentNode(e.target) //cur cur.par cur.par.par
// nodeArr -> String
//$('最外层的 parent clas id').children('次外层 parent + class id').....children('cur .class #id')
let res = nodeArr.reduce((prevString, curNode, index) => {
//className_str 获取
let className_str = ''
curNode.classList.forEach(className => {
className_str += `.${className}`
})
//拼装当前 node str
const curString = `${index === 0 ? '$' : '.children'}('${curNode.localName}${!!curNode.id ? '#' + curNode.id : ''}${className_str}')`
return prevString += curString
}, '')
const tag = e.target.alt ? e.target.alt : e.target.innerHTML
//输出
console.log('当前节点名称:' + tag + '\n' + res)
return
}
function locateClickedDOM(e) {
e.preventDefault()
// 获取当前的节点
// 递归获取所有的符合要求的父节点,数组返回
const matchedArr = getMatchedParents(e.target)
//整理需要返回的数组,生成cheerio 格式的数据
const cheerioData = createCheerioString([
...matchedArr, [e.target]
])
console.log(cheerioData)
return
function getMatchedParents(node, resArr = []) {
const $curNodeParent = $(node).parent()
//如果当前节点的父节点为body 那么结束递归
if ($curNodeParent.prop('tagName') === 'BODY') return resArr
//获取当前节点的父节点,以及父节点前面的节点,将父节点放在结果数组中
let prevArr = $curNodeParent.prevAll().filter($curNodeParent.prop('tagName')).toArray()
return getMatchedParents($curNodeParent[0], [
[$curNodeParent[0], ...prevArr], ...resArr
])
}
function createCheerioString(nodeArr) {
return nodeArr.reduce((combinedData, curNodeArr, index) => {
//确定第一个节点 :从body开始计算 ${'body'}.children(firstNode).eq(arrLen-1)
//非第一个节点:.children(firstNode).eq(arrLen-1)
let curData = `${index===0 ? `$('body')`:''}.children('${curNodeArr[0].localName}').eq(${curNodeArr.length-1})`
return combinedData += curData
}, '')
}
}