在 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
测试它,看看它是TextNode
、Element
还是其他什么。然后你将它转换为相关的 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。
我有这样的 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
测试它,看看它是TextNode
、Element
还是其他什么。然后你将它转换为相关的 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。