【问题标题】:How do I use Jsoup to insert tag before element如何使用 Jsoup 在元素前插入标签
【发布时间】:2016-01-14 12:49:08
【问题描述】:

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

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

【问题讨论】:

  • 你能举例说明嵌套标签的含义吗?

标签: java html parsing jsoup


【解决方案1】:

您可以使用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>

【讨论】:

    【解决方案2】:

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

    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>
    

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      相关资源
      最近更新 更多