javascript - 使用 cheerio 和执行逻辑迭代源页面

标签 javascript html cheerio

我希望能够使用 cheerio 对源页面中的所有 HTML 执行一些逻辑.我不确定如何执行此操作,因为我似乎无法在 cheerio library 中找到可以执行此操作的方法。 .我认为最接近的方法是 .each() method .但是,似乎我需要先匹配一个标签。我想对每一段 HTML 执行逻辑。

这是我目前所拥有的:

    let $ = cheerio.load(pageSource);

这是我想应用于每个标签及其内容的功能:

    summarizeContent(content) {
        let contentLength = content.length;
        let middle = " ....... ";
        if ((contentLength> this.contentSummarizeMinLength) && (contentLength < this.contentSummarizeMaxLength)) {
            let chunkIndex = 0;
            const increment = 5;
            while (contentLength > this.contentSummarizeMinLength) {
                chunkIndex += increment;
                contentLength -= 2 * increment;
            }
            content = content.substring(0, chunkIndex) + middle + content.substr(-chunkIndex);
        } else if (contentLength >= this.contentSummarizeMaxLength) {
            const chunk = 20;
            content = content.substring(0, chunk) + middle + content.substr(-chunk);
        }
        return content;
    }

所以在 HTML 转换之后,如果这是我的输入,我应该有这样的输出:

<ul id="fruits">
    <li class="apple">AppleAppleAppleAppleAppleAppleAppleAppleApple</li>
    <li class="orange">OrangeOrangeOrangeOrangeOrangeOrangeOrange</li>
    <li class="pear">PearPearPearPearPearPearPearPearPearPearPearPear</li
</ul>

输出:

<ul id="fruits">
    <li class="apple">AppleApple ...... AppleApple</li>
    <li class="orange">Orange ...... Orange</li>
    <li class="pear">PearPear ...... PearPear</li
</ul>

<li>内的内容标签无关紧要。我只想能够将一个函数应用于 HTML 标记之间的某些内容。不需要使用 Cheerio,它是我发现我应该做这项工作的第一个库。

最佳答案

HTML 页面被组织为节点树。您需要遍历该树并汇总在传递元素节点以处理其文本节点时找到的任何文本节点。您可以使用递归函数来执行此操作。对于元素节点,您将再次调用递归函数,对于文本节点,您将调用您编写的 summarizeContent 函数。

//You can find a list of node types here: https://developer.mozilla.org/en/docs/Web/API/Node/nodeType
var TEXT_NODE_TYPE = 3,
    ELEMENT_NODE_TYPE = 1;

function summarizeElementNode(node) {
    node.contents().each(function(ix, el) {
        var $el = $(el);
        switch($el.nodeType) {
            case TEXT_NODE_TYPE:
                summarizeContent($el);
                break;

            case ELEMENT_NODE_TYPE:
                summarizeElementNode($el);
                break;
    });
}

然后,您只需要在文档根目录上调用summarizeElementNode

var $ = cheerio.load(pageSource);
summarizeElementNode($.root());

关于javascript - 使用 cheerio 和执行逻辑迭代源页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176526/

相关文章:

html - 在哪里可以找到 HTML5 标签和属性的详细、最新引用?

html - 如何在 Sublime Text 2 中禁用 Emmet 的 CSS 缩写

javascript - 使用 jQuery/cheerio 访问脚本标签中的变量

javascript - 如何验证文本框以检查输入的值是否仅是 100 的倍数

javascript - IE 7 & 8 javascript 文件使用 require.js 进行缓存

javascript - 开发环境中与AJAX数据服务有关的PhoneGap环境变量?

javascript - 打开对话框后设置焦点 - Polymer(无 JQuery)

javascript - 我可以在 javascript 的消息框中加入链接吗?

javascript - Express 和 Cheerio/JSDOM

javascript - Cheerio:需要将 $ 与元素一起传递吗?