【问题标题】:Cheerio get content including the breaks and H tags from .text()Cheerio 从 .text() 获取包含中断和 H 标记的内容
【发布时间】: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 包装吗?
  • 可能你想要某种正则表达式解决方案。

标签: javascript jquery node.js web-scraping cheerio


【解决方案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 使用 $ 作为其名称空间的一部分,并且您正在为 $ 分配一个新值。
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2023-03-11
  • 2017-03-25
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多