jQuery 获取除子元素 X 之外的子元素的 HTML

Posted

技术标签:

【中文标题】jQuery 获取除子元素 X 之外的子元素的 HTML【英文标题】:jQuery Get HTML of Children except Child Element X 【发布时间】:2016-03-18 01:59:31 【问题描述】:

如何使用jQuery/javascript 来选择第一个<div class="description 中两个<p> 元素的html?正则表达式也很好。这个 jQuery 选择实际上是在 Node.js 中的 cheerio 对象上完成的。

使用

$( $('.description')[0] ).children().not('h2').html()

似乎只抓取文字

Foo Bar

而不是

<p>Foo</p> 
<p>Bar</p>

HTML:

<div class='description'>
  <h2>Hello world</h2>
  <p>Foo</p>
  <p>Bar</p>
</div>

<div class='description'>
  <h2>Goodbye world</h2>
  <p>Didi</p>
  <p>Deedee</p>
</div>

【问题讨论】:

$(".description").eq(0).children().slice(1) 将为您提供实际的节点,而不是标签。为什么你也想要标签? @thedarklord47 是的,我也想要标签 可能会有所帮助..jsfiddle.net/mohamedyousef1980/4ef5g3h1 @thedarklord47 我正在抓取网页并希望保留格式标记,例如 b i br。在原网页上,&lt;p&gt; 用于定义段落,没有&lt;p&gt; 文本将全部组合成一个大段落。 【参考方案1】:

如果你解构你的 jQuery 语句,你会得到以下结果:

$('.description')[0]

将返回您的第一个 &lt;div&gt; 节点。

$( $('.description')[0] ).children()

将返回一个包含该&lt;div&gt; 节点的所有子节点的数组,因此这是一个包含三个节点的数组,一个&lt;h2&gt; 和两个&lt;p&gt;

$( $('.description')[0] ).children().not('h2')

将返回与上面相同的数组,减去&lt;h2&gt;

$( $('.description')[0] ).children().not('h2').html()

.html() 应用于这些节点中的每一个,即提取节点内的所有html。而在&lt;p&gt;Foo&lt;/p&gt; 里面是Foo

这就是你要找的东西:

$( $('.description')[0] ).children().not('h2').prop('outerHTML')

更新:基于Cheerio docs:您需要这样做:

如果你想返回outerHTML你可以使用$.html(selector):

所以,在你的情况下,我会尝试:

$( $('.description')[0] ).children().not('h2').html('p')

【讨论】:

Cheerio 有“outerHTML”道具吗?我不认为它模拟了整个 DOM。 这会将选择器的 html 更改为 'p'【参考方案2】:

您可以创建一个重复的元素并删除您不想要的所有内容,或者如果您以后不需要访问h2,则在您的原始元素上执行此操作。

var dup = $(".description").clone();
dup.children("h2").remove();
var out = dup.html();

【讨论】:

【参考方案3】:

更新:

根据文档,您可以尝试以下操作:

$.html($('.description:first').children(':not(h2)'));

【讨论】:

和 Olivier 的回答一样,同样的问题。 outerHTML 是 DOM 元素的一个属性,不受外部 js api 的影响 这是服务器端的 JavaScript,而 Cheerio 有一个非常精简的 DOM【参考方案4】:

您可以在 jQuery 中通过.prop("tagName") 使用更简洁的方法。

【讨论】:

以上是关于jQuery 获取除子元素 X 之外的子元素的 HTML的主要内容,如果未能解决你的问题,请参考以下文章

DOM节点的删除(jQuery)

jQuery修炼心得-DOM节点的删除

转载JQuery 中empty, remove 和 detach的区别

XPath 获取除具有特定名称的子元素之外的所有子元素?

jquery如何获取父元素的子元素

jquery获取指定元素下的子元素