Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用cheerio进行DOM遍历-如何获取所有元素及其对应的文本_Javascript_Node.js_Cheerio_Dom Traversal - Fatal编程技术网

Javascript 使用cheerio进行DOM遍历-如何获取所有元素及其对应的文本

Javascript 使用cheerio进行DOM遍历-如何获取所有元素及其对应的文本,javascript,node.js,cheerio,dom-traversal,Javascript,Node.js,Cheerio,Dom Traversal,因此,我使用的是Cheerio,这是一个类似于节点服务器端的jQuery的库,它允许您解析html文本并遍历它,就像使用jQuery一样。我需要得到html正文的纯文本,但不仅如此,我还需要得到相应的元素和数字。IE:如果在第三段元素中找到纯文本,我会有如下内容: { text: <element plaintext>, element: "p-3" } 我是否朝着正确的方向前进,我是否应该尝试其他方法?在此方面的任何帮助都将不胜感激。同样,这不是jQuery,而是

因此,我使用的是Cheerio,这是一个类似于节点服务器端的jQuery的库,它允许您解析html文本并遍历它,就像使用jQuery一样。我需要得到html正文的纯文本,但不仅如此,我还需要得到相应的元素和数字。IE:如果在第三段元素中找到纯文本,我会有如下内容:

{
    text: <element plaintext>,
    element: "p-3"
}

我是否朝着正确的方向前进,我是否应该尝试其他方法?在此方面的任何帮助都将不胜感激。同样,这不是jQuery,而是服务器端的Cheerio。(然而,它们非常相似)

我认为如果使用
*
css选择器,则不需要进行大量遍历

function textElements($){
  const found = {}
  return $('body *').map(function(el){
    if ( $(this).children().length || $(this).text() === '' ) return
    found[this.name] = found[this.name] ? 1 + found[this.name] : 1
    return {
      text: $(this).text(),
      element: `${this.name}-${found[this.name]}`,
    }
  }).get()
}

textElements(cheerio.load(html)

从您当前的代码来看,您似乎乐于忽略具有子元素和文本的元素?就像
文本中的
dt
是的,这是我遇到的问题之一。我不知道如何处理这种情况而不获得大量的重复项,比如说
会为td和a拾取“废话废话”。这似乎是可行的,但当html类似于
hello,单击此处查看我们的结果时,它仍然会遇到问题,它只从那里拾取“单击此处”。
function textElements($){
  const found = {}
  return $('body *').map(function(el){
    if ( $(this).children().length || $(this).text() === '' ) return
    found[this.name] = found[this.name] ? 1 + found[this.name] : 1
    return {
      text: $(this).text(),
      element: `${this.name}-${found[this.name]}`,
    }
  }).get()
}

textElements(cheerio.load(html)