【问题标题】:Remove all elements after given tag删除给定标签后的所有元素
【发布时间】:2015-09-17 02:27:51
【问题描述】:

tag结构如下:

<div class="some-class">
  <h3>Foo</h3>
  <p>...</p>
  <p>...</p>
  <h3>Bar</h3>
  <p>...</p>
  <p>...</p>
  ...

现在我想在找到h3 标记后删除some-class 标记中的所有元素。 JSoup 中是否有 nextAll() 方法,就像 JavaScript 一样?

我现在有

for (Element el : doc.select("div") {
  if (el.className().equalsIgnoreCase("some-class") {
    for (Element e : el.select("h3") {
      if (e.hasText().equalsIgnoreCase("Bar") {
        removeAllNextPTags();
      }
    }
  }
}

有什么想法吗?

【问题讨论】:

    标签: java parsing html-parsing jsoup


    【解决方案1】:

    JSoup中是否有nextAll()方法

    您可以在元素基础上使用nextElementSibling(),或者在节点基础上使用nextElementSibling()

    我不完全确定我的理解是否正确,但是你想在 h3 之后删除 所有 元素还是只删除 p 元素(直到另一个 h3 出现!?)?

    以下是删除所有 p 元素的方法,从具有给定文本的 h3 元素开始 - 直到找到另一个 h3:

    public void removeChilds(Element root, String h3Text)
    {
        final Element h3Start = root.select("h3:contains(" + h3Text + ")").first();
        final int h3Idx = h3Start.siblingIndex();
    
        for( Element e : h3Start.siblingElements() )
        {
            // Skip all nodes before the relevant h3 element
            if( e.siblingIndex() > h3Idx )
            {
                switch(e.tagName())
                {
                    case "p":
                        e.remove();
                        break;
                    case "h3":
                        /* Stop if there's a h3 */
                        return;
                    default:
                        /* Stop also if there's any non-p element!? */
                        return;
                }
            }
        }
    }
    

    为所有带有给定文本的 h3 执行此操作 - 例如。多个带有子元素的 &lt;h3&gt;Foo&lt;/h3&gt; 元素 - 您可以将 first() 替换为找到的元素的循环(这就是 select() 返回的内容)。

    【讨论】:

    • 现在有了nextElementSiblings()方便的方法,所以你不需要遍历前面的兄弟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多