【问题标题】:How to delete a part of the htmlparse?如何删除htmlparse的一部分?
【发布时间】:2015-08-05 12:29:06
【问题描述】:

我对一个网页进行 htmlparse,然后我得到一个带有这个块的页面的 DOM:

 { raw: 'td',
   data: 'td',
   type: 'tag',
   name: 'td',
   children: [ { raw: '600', data: '600', type: 'text' } ] },

如何删除该 htmlparse 的所有“文本”类型? 谢谢。

【问题讨论】:

    标签: javascript node.js dom html-parsing html-parser


    【解决方案1】:

    如果您想删除任何具有文本类型的子项,只需遍历所有子项并使用 array.splice 删除具有文本类型的一次。

    var output = document.getElementById('output'),
        htmlParse = { raw: 'td',
                         data: 'td',
                         type: 'tag',
                         name: 'td',
                         children: [
                           { raw: '600', data: '600', type: 'text' },
                           { raw: '100', data: '100', type: 'num' }
                         ] 
                        };
    
    for(var i = 0; i < htmlParse.children.length; i++) {
      if (htmlParse.children[i].type === "text") {
        htmlParse.children.splice(i, 1);
      } 
    }
    output.innerHTML = JSON.stringify(htmlParse);
    console.log(htmlParse);
    &lt;div id="output"&gt;&lt;/div&gt;

    【讨论】:

      【解决方案2】:

      如果你想递归删除所有文本节点,你可以这样做:

      var _ = require('underscore');
      var deleteText = function(node) {
          if (!node.children || node.children.length === 0) {
              return;
          }
      
          // Exclude text nodes
          node.children = _.filter(node.children, function(child) {
              return child.type !== 'text';
          });
      
          // Recurse over child nodes
          _.each(node.children, deleteText);
      };
      
      deleteTextNodes(parsed);
      

      【讨论】:

      • 那里没有理由使用delete。只需使用.splice()。仅供参考,您的递归调用最后需要Nodes
      • 另外,您正在前向迭代期间修改数组。这将导致它在每次删除一个节点时跳过一个节点。
      猜你喜欢
      • 2014-07-19
      • 2010-11-03
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多