在 Java 中以编程方式添加 <p> 标签

Add <p> tags programatically in Java

我有这样的 HTML 代码:

<p> This is paragraph 1 </p>
This is paragraph 2
<p> This is paragraph 3 </p>

我将在 Java 中处理上述 HTML,我希望处理后的 HTML 为:

<p> This is paragraph 1 </p>
<p> This is paragraph 2 </p>
<p> This is paragraph 3 </p>

并且可能会有超过一行的大段落。因此,逐行处理在这种情况下不起作用。例如,

<p> ...
...
...
</p>

可能会有这样的情况,

<p> This </p> can be <p> the case too. </p>

我需要将上面的行转换为:

<p> This </p><p> can be </p><p> the case too. </p>

我想实现这个,因为 Jsoup 无法识别没有 < p > 标签的文本。如果 Jsoup 可以通过任何方式做到这一点,我也很高兴。我不希望文档中遗漏任何文本。

您是否尝试过编写解析器来检查每行开头是否有 p 标记?

代码可能看起来像这样:

String[] splitted = html_code.split("\n");
String solution="";
for(String s : splitted){
    s = s.trim();
    if(s.startsWith("<p>"){
        solution+=s;
    }else{
        solution = "<p>"+s+"</p>;
    }
}

JSoup 可以为您提供 <P> 中没有的部分。由于它们未包含在标签中,因此它们是 文本节点 而不是元素。所以你应该遍历节点而不是元素。这是一个例子:

public class SimpleTest {

    public static final String HTML = "<p> This is paragraph 1 </p>\n"
                                    + "This is paragraph 2\n"
                                    + "<p> This is paragraph 3 </p>";

    public static void main(String[] args) {

        Document doc = Jsoup.parse(HTML);

        List<Node> nodes = doc.body().childNodes();

        for ( Node node : nodes ) {
            System.out.printf("Node of %s, %s%n", node.getClass(), node);
        }
    }
}

输出为:

Node of class org.jsoup.nodes.Element, <p> This is paragraph 1 </p>
Node of class org.jsoup.nodes.TextNode,  This is paragraph 2 
Node of class org.jsoup.nodes.Element, <p> This is paragraph 3 </p>

所以当你想对一个未知节点做一些实用的事情时,你应该用instanceof测试它,看看它是TextNodeElement还是其他什么。然后你将它转换为相关的 class,你可以使用它的所有方法,除了 Node.

中可用的方法。

太棒了,我在 RealSkeptic 的帮助下弄明白了。这只是适合问题的代码的改进版本:

for( Node node : nodes ) {
       if( node.getClass() == Element.class ) {
           Element element = (Element) node; 
           System.out.println( element.tag() + " " + element.text() );
       }
       else if( node.getClass() == TextNode.class && ! node.toString().trim().isEmpty() )
           System.out.println( node.toString().trim() );
}

这里我检查了节点isEmpty,因为Jsoup 将每一行都视为一个TextNode。