Cheerio:使用分隔符从 HTML 中提取文本

Cheerio: Extract Text from HTML with separators

假设我有以下内容:

$ = cheerio.load('<html><body><ul><li>One</li><li>Two</li></body></html>');

var t = $('html').find('*').contents().filter(function() {
  return this.type === 'text';
}).text(); 

我得到:

OneTwo

而不是:

One Two

这与我 $('html').text() 得到的结果相同。所以基本上我需要的是注入一个分隔符,比如 </code> (space) 或 <code>\n

注意:这不是 jQuery 前端问题,更像是 Cheerio 和 HTML 解析的 NodeJS 后端相关问题。

这似乎可以解决问题:

var t = $('html *').contents().map(function() {
    return (this.type === 'text') ? $(this).text() : '';
}).get().join(' ');

console.log(t);

结果:

One Two

只是稍微改进了我的解决方案:

var t = $('html *').contents().map(function() {
    return (this.type === 'text') ? $(this).text()+' ' : '';
}).get().join('');

您可以使用 TextVersionJS 包生成 html 字符串的纯文本版本。您可以在浏览器和 node.js 中使用它。

var createTextVersion = require("textversionjs");

var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";

var textVersion = createTextVersion(yourHtml);

npm 下载并使用 Browserify 要求它。

您可以使用以下函数从由 whitespace 分隔的 html 中提取文本:

function extractTextFromHtml(html: string): string {
  const cheerioStatic: CheerioStatic = cheerio.load(html || '');

  return cheerioStatic('html *').contents().toArray()
    .map(element => element.type === 'text' ? cheerioStatic(element).text().trim() : null)
    .filter(text => text)
    .join(' ');
}