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

时间:2015-10-31 08:10:07

标签: java html jsoup

我有这样的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没有&lt; p>标签。如果Jsoup可以通过任何方式做到这一点,我也很满意。我不希望文档遗漏任何文字。

3 个答案:

答案 0 :(得分:2)

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还是其他内容。然后将其强制转换为相关类,除Node中提供的方法外,还可以使用其所有方法。

答案 1 :(得分:0)

您是否尝试编写解析器以检查每行开头是否有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>;
    }
}

答案 2 :(得分:0)

很酷,我在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。