Cheerio 从 .text() 获取包含中断和 H 标记的内容

Posted

技术标签:

【中文标题】Cheerio 从 .text() 获取包含中断和 H 标记的内容【英文标题】:Cheerio get content including the breaks and H tags from .text() 【发布时间】:2021-03-31 18:04:54 【问题描述】:

有没有办法使用包含一些 html 标签的 Cheerio 从 html 输出文本?我知道 .html() 输出完整的 html,但我只想要使用 .text() 的文本,但包含所有 H 标记和中断?

例子:

<div class="className"><h1>Something here</h1></br><p>Next line text</p></div>

应该输出:

<h1>Something here</h1></br>Next line text

编写我现在拥有的代码:

const $ = await fetchHTML(thisEntry.link);
const content = $(`div[class='$feedDiv']`).text()

仅输出没有任何换行符或 H1 标记的 div 文本。默认情况下,.text() 也输出&lt;img&gt; 标签。

更新 我正在尝试执行 cmets 中讨论的修剪功能,但仍然无法正常工作......我是否忽略了什么?

async function fetchHTML(url) 
    const  data  = await axios.get(url);
    return cheerio.load(data,  decodeEntities: false );


async function createFeed(feedConfig, entries) 
const $ = await fetchHTML(thisEntry.link);

        $(function () 
            function clean(o, h) 
                var results = '';
                if (h == undefined) 
                    results = o.text().trim();
                 else 
                    $(o)
                        .children()
                        .each(function (i, el) 
                            if (h.indexOf($(el).prop('nodeName').toLowerCase()) >= 0) 
                                console.log('Found', $(el).prop('nodeName'));
                                results += $(el).prop('outerHTML');
                             else 
                                console.log($(el).text().trim());
                                results += $(el).text().trim();
                            
                        );
                
                return results;
            

            $(".className").html(clean($(".className"), ["h1", "br"]));
        );

console.log($.text().trim());

控制台不输出任何内容

【问题讨论】:

所有项目都用 HTML 包装吗? 可能你想要某种正则表达式解决方案。 【参考方案1】:

您可以制作自己的修剪样式功能。输入要保留的对象和元素。

例子:

$(function() 
  function clean(o, h) 
    var results = "";
    if (h == undefined) 
      results = o.text().trim();
     else 
      $(o).children().each(function(i, el) 
        if (h.indexOf($(el).prop("nodeName").toLowerCase()) >= 0) 
          console.log("Found", $(el).prop("nodeName"));
          results += $(el).prop("outerHTML");
         else 
          console.log($(el).text().trim());
          results += $(el).text().trim();
        
      );
    
    return results;
  

  $(".className").html(clean($(".className"), ["h1", "br"]));
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="className">
  <h1>Something here</h1>
  </br>
  <p>Next line text</p>
</div>

这里有一个陷阱,如果有原始文本,它也可能会被剥离。

【讨论】:

嗯,不知道你能做到这一点,但它仍然不能与那个修剪功能一起工作。请参阅上面的更新代码... @Jan 你在控制台看到了什么? @Jan 请澄清您所说的“它仍然不适用于该修剪功能。 对不起...控制台不输出任何文本,请参阅上面的更新代码。谢谢 @Jan 你已经说过了。我非常有信心您的问题在这里:const $ = await fetchHTML(thisEntry.link); 如果您在控制台中没有输出;那么你的代码都没有运行。我不使用 Node.js,所以也许我遗漏了一些东西,但 jQuery 使用 $ 作为其名称空间的一部分,并且您正在为 $ 分配一个新值。

以上是关于Cheerio 从 .text() 获取包含中断和 H 标记的内容的主要内容,如果未能解决你的问题,请参考以下文章

使用cheerio在没有孩子的父母中获取文本

有没有办法选择cheerio中的每一个元素?

将cheerio对象转换为字符串

Cheerio 获取元素外部 html

如何使用 Cheerio 访问包含不同属性值的 DOM 属性?

如何使用 node.js 在cheerio 中获取元素名称