我有这样的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可以通过任何方式做到这一点,我也很满意。我不希望文档遗漏任何文字。
答案 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
对其进行测试,以查看它是TextNode
,Element
还是其他内容。然后将其强制转换为相关类,除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。