J汤。按顺序打印所有文本节点
Jsoup. Print all text nodes in order
我想用 Jsoup 解析它(这是一种简化,我会解析整个网页)
<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>
按照出现的顺序获取所有文本元素,这是:
A B C D E
我尝试了两种方法:
Elements elements = doc.children().select("*");
for (Element el : elements)
System.out.println(el.ownText());
哪个returns:
A C E B D
这是,"strong" 标签之间的元素放在最后。
我也试过递归版本:
myfunction(doc.children());
private void myfunction(Elements elements) {
for (Element el : elements){
List<Node> nodos = el.childNodes();
for (Node nodo : nodos) {
if (nodo instanceof TextNode && !((TextNode) nodo).isBlank()) {
System.out.println(((TextNode) nodo).text());
}
}
myfunction(el.children());
}
但是结果和之前一样
如何实现?我觉得我把一些简单的事情变得困难了...
怎么样:
private static void myfunction(Node element) {
for (Node n : element.childNodes()) {
if (n instanceof TextNode && !((TextNode) n).isBlank()) {
System.out.println(((TextNode) n).text());
} else {
myfunction(n);
}
}
}
演示:
String html = "<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>";
Document doc = Jsoup.parse(html);
myfunction(doc.body());
输出:
A
B
C
D
E
Java 15 更新以避免强制转换 (TextNode) n
(有关详细信息,请参阅 JEP 375: Pattern Matching for instanceof (Second Preview))
private static void myfunction(Node element) {
for (Node n : element.childNodes()) {
if (n instanceof TextNode tNode && !tNode.isBlank()) {
System.out.println(tNode.text());
} else {
myfunction(n);
}
}
}
text()
方法可以解决问题,例如以下
public static void main(String[] args) {
Document doc = Jsoup.parse("<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>");
String texts = doc.body().text();
System.out.println(texts);
}
我想用 Jsoup 解析它(这是一种简化,我会解析整个网页)
<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>
按照出现的顺序获取所有文本元素,这是:
A B C D E
我尝试了两种方法:
Elements elements = doc.children().select("*");
for (Element el : elements)
System.out.println(el.ownText());
哪个returns:
A C E B D
这是,"strong" 标签之间的元素放在最后。
我也试过递归版本:
myfunction(doc.children());
private void myfunction(Elements elements) {
for (Element el : elements){
List<Node> nodos = el.childNodes();
for (Node nodo : nodos) {
if (nodo instanceof TextNode && !((TextNode) nodo).isBlank()) {
System.out.println(((TextNode) nodo).text());
}
}
myfunction(el.children());
}
但是结果和之前一样
如何实现?我觉得我把一些简单的事情变得困难了...
怎么样:
private static void myfunction(Node element) {
for (Node n : element.childNodes()) {
if (n instanceof TextNode && !((TextNode) n).isBlank()) {
System.out.println(((TextNode) n).text());
} else {
myfunction(n);
}
}
}
演示:
String html = "<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>";
Document doc = Jsoup.parse(html);
myfunction(doc.body());
输出:
A
B
C
D
E
Java 15 更新以避免强制转换 (TextNode) n
(有关详细信息,请参阅 JEP 375: Pattern Matching for instanceof (Second Preview))
private static void myfunction(Node element) {
for (Node n : element.childNodes()) {
if (n instanceof TextNode tNode && !tNode.isBlank()) {
System.out.println(tNode.text());
} else {
myfunction(n);
}
}
}
text()
方法可以解决问题,例如以下
public static void main(String[] args) {
Document doc = Jsoup.parse("<html><body><p>A<strong>B</strong>C<strong>D</strong>E</p></body></html>");
String texts = doc.body().text();
System.out.println(texts);
}