如何使用Jsoup在元素之前插入标记

时间:2016-01-14 12:49:08

标签: java html parsing jsoup

我需要循环使用属性href的所有类型锚的标签(这是有效的)。然后,如何使用JSoup在每个锚点/ href标记之前插入一个新标记?

编辑:谢谢你的回复。我需要澄清一下:我不仅需要在href标签之前添加新标签,而且我必须根据某些标准嵌套这些标签。我如何嵌套这些标签?

2 个答案:

答案 0 :(得分:3)

您可以使用Element before(String html)方法。 这是一个例子:

String html = "<div><div>Filler 1</div><div>Filler 2</div><a href=\"page.html\"/><div>Filler 3</div></div>";
Document doc = Jsoup.parse(html);
Elements elms = doc.select("a[href]");
for (Element e : elms) {
    e.before("<div>Added Now</div>");
}
System.out.println(doc.html());

这将输出:

<html>
 <head></head>
 <body>
  <div>
   <div>
    Filler 1
   </div>
   <div>
    Filler 2
   </div>
   <div>
    Added Now
   </div>
   <a href="page.html"></a>
   <div>
    Filler 3
   </div>
  </div>
 </body>
</html>

答案 1 :(得分:0)

如果要对节点进行任何操作,请使用以下程序。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Node;
import org.jsoup.select.NodeVisitor;

public class InsertTagBefore {
    public static void main(String... args) {
        final String html = "<div><div>Filler 1</div><div>Filler 2</div><a href=\"page.html\"/><div>Filler 3</div></div>";
        Document document = Jsoup.parse(html);

        document.select("a").forEach(action -> { // Java 8 For Each
            action.traverse(new NodeVisitor() {
                /**
                 * method is called at the Start of the node
                 * 
                 * @param node
                 * @param depth
                 */
                @Override
                public void head(Node node, int depth) {
                    node.before("<rama>head");
                }

                /**
                 * method is called at the end of the node
                 * 
                 * @param node
                 * @param depth
                 */
                @Override
                public void tail(Node node, int depth) {
                    node.before("</rama>");
                }
            });
        });
        System.out.println(document);
    }
}

我已经在锚标记之前插入了节点rama。

<html>
  <head></head>
  <body>
      <div>
          <div>Filler 1</div>
          <div>Filler 2</div>
          <rama> head </rama>
          <a href="page.html"></a>
          <div>Filler 3</div>
      </div>
  </body>
</html>