Javascript 获取两个元素之间的内容

Javascript 获取两个元素之间的内容,javascript,jquery,cheerio,Javascript,Jquery,Cheerio,我有HTML字符串,我需要从中提取HTML子字符串(摘要、关键字等)。字符串如下所示: const content = "<p> <strong>Summary</strong><br />Some text with <strong>HTML</strong> tags...<br /><br /> <strong>Keywords</strong> keyword1, ke

我有HTML字符串,我需要从中提取HTML子字符串(摘要、关键字等)。字符串如下所示:

const content = "<p>
<strong>Summary</strong><br />Some text with <strong>HTML</strong> tags...<br /><br />
<strong>Keywords</strong> keyword1, keyword2,...<br /><br />
...
</p>"
使用foreach的nextUntil():

const $ = cheerio.load(content);
let container = $('<container/>');
for (let i = 0; i < $("strong:contains('Summary')").nextUntil( "strong:contains('Keywords')" ).length; i++) {
  container.append($("strong:contains('Summary')").nextUntil( "strong:contains('Keywords')" )[i]);
}
console.log('container: ', container.html());
// Returns: "<strong>Summary</strong>" 
const$=cheerio.load(内容);
让容器=$('');
for(设i=0;i<$(“strong:contains('Summary')))。nextUntil(“strong:contains('Keywords')))。长度;i++){
container.append($($strong:contains('Summary'))).nextUntil($strong:contains('Keywords')))[i]);
}
log('container:',container.html());
//返回:“摘要
我认为问题源于摘要和关键字文本不是它们各自标题的同级

您可以改为使用正则表达式解析HTML字符串

const content = '<p>' + 
'<strong>Summary</strong><br />Some text with <strong>HTML</strong> tags...<br /><br />' +
'<strong>Keywords</strong> keyword1, keyword2,...<br /><br />' +
'</p>';

var summary = content.match('<strong>Summary</strong><br />(.*?)<br /><br />');
var keywords = content.match('<strong>Keywords</strong> (.*?)<br /><br />');
alert (summary[1]);
alert (keywords[1]);
const content=''+
“摘要
一些带有HTML标记的文本…

”+ “关键字关键字1,关键字2,…

”+ “

”; var summary=content.match(“summary
(.*?

”); var keywords=content.match('关键字(.*)

'); 警报(摘要[1]); 警报(关键词[1]);
我认为问题源于摘要和关键字文本不是它们各自标题的同级

您可以改为使用正则表达式解析HTML字符串

const content = '<p>' + 
'<strong>Summary</strong><br />Some text with <strong>HTML</strong> tags...<br /><br />' +
'<strong>Keywords</strong> keyword1, keyword2,...<br /><br />' +
'</p>';

var summary = content.match('<strong>Summary</strong><br />(.*?)<br /><br />');
var keywords = content.match('<strong>Keywords</strong> (.*?)<br /><br />');
alert (summary[1]);
alert (keywords[1]);
const content=''+
“摘要
一些带有HTML标记的文本…

”+ “关键字关键字1,关键字2,…

”+ “

”; var summary=content.match(“summary
(.*?

”); var keywords=content.match('关键字(.*)

'); 警报(摘要[1]); 警报(关键词[1]);
这里有一种不同的方法;有点老套,但很有效:

const content=`
摘要
一些带有HTML标记的文本…

关键字关键字1,关键字2,…

...

`, html=$(内容); const summary=getHtml(html.find(“strong:contains(summary)”); const-keywords=getHtml(html.find(“strong:contains(keywords)”); 控制台日志(摘要); console.log(关键字); 函数getHtml(html){ const summary=[]; 让currentEl=html.prop(“nextSibling”); while(true){ //如果当前和下一个元素都是
,则到达终点 if(currentEl.tagName==“BR”&¤tEl.nextSibling.tagName==“BR”){ //如果这是“关键字”,则不要添加后面的
元素 如果(html.text().trim()!=“关键字”){ //push(“

”)也可以在这里使用 summary.push(currentEl.outerHTML,currentEl.nextSibling.outerHTML); } 返回summary.join(“”.trim(); }否则{ //节点类型1=元素 //节点类型3=文本 const content=currentEl.nodeType==1?currentEl.outerHTML:currentEl.textContent; //按HTML字符串并继续 推送(内容); currentEl=currentEl.nextSibling; } } }

这里有一种不同的方法;有点老套,但很有效:

const content=`
摘要
一些带有HTML标记的文本…

关键字关键字1,关键字2,…

...

`, html=$(内容); const summary=getHtml(html.find(“strong:contains(summary)”); const-keywords=getHtml(html.find(“strong:contains(keywords)”); 控制台日志(摘要); console.log(关键字); 函数getHtml(html){ const summary=[]; 让currentEl=html.prop(“nextSibling”); while(true){ //如果当前和下一个元素都是
,则到达终点 if(currentEl.tagName==“BR”&¤tEl.nextSibling.tagName==“BR”){ //如果这是“关键字”,则不要添加后面的
元素 如果(html.text().trim()!=“关键字”){ //push(“

”)也可以在这里使用 summary.push(currentEl.outerHTML,currentEl.nextSibling.outerHTML); } 返回summary.join(“”.trim(); }否则{ //节点类型1=元素 //节点类型3=文本 const content=currentEl.nodeType==1?currentEl.outerHTML:currentEl.textContent; //按HTML字符串并继续 推送(内容); currentEl=currentEl.nextSibling; } } }

使用
nextUntil()
的方法不起作用,因为给定的
DOM元素没有包含任何可用内容(html)的同级元素。相反,在父元素的
元素中只能找到文本内容

我们必须应用某种正则表达式匹配方法,如下图所示(请注意,如果
摘要
关键字
部分出现不止一次,则只会考虑每个部分最近出现的情况):

const content=$(“\n\
摘要
一些带有\n\HTML标记的文本…

\n\ 关键字关键字1,关键字2,…

\n\ …\n\

”).html();//我使用jquery-html()来提取外部元素的innerHTML const arr=content.split(/(摘要|关键字)/);
对于(var i=1;i使用
nextUntil()
的方法不起作用,因为给定的
DOM元素没有包含任何可用内容(html)的同级元素。相反,只有textContent可以作为父元素
元素的一部分找到

我们必须应用某种正则表达式匹配方法,如下图所示(请注意,如果
摘要
关键字
部分出现不止一次,则只会考虑每个部分最近出现的情况):

const conten
const content = '<p>' + 
'<strong>Summary</strong><br />Some text with <strong>HTML</strong> tags...<br /><br />' +
'<strong>Keywords</strong> keyword1, keyword2,...<br /><br />' +
'</p>';

var summary = content.match('<strong>Summary</strong><br />(.*?)<br /><br />');
var keywords = content.match('<strong>Keywords</strong> (.*?)<br /><br />');
alert (summary[1]);
alert (keywords[1]);