删除给定标记后的所有元素

时间:2015-06-30 10:27:29

标签: java parsing html-parsing jsoup

tag结构如下:

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

现在,我想在找到some-class标记后删除h3代码中的所有元素。 nextAll()中的JSoup方法是否与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();
      }
    }
  }
}

有什么想法吗?

1 个答案:

答案 0 :(得分: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执行此操作 - 例如。多个<h3>Foo</h3> - 包含子项的元素 - 您可以将first()替换为找到的元素(即select()返回的内容)。