Jsoup - извлечение текста
мне нужно извлечь текст из такого узла:
<div>
Some text <b>with tags</b> might go here.
<p>Also there are paragraphs</p>
More text can go without paragraphs<br/>
</div>
и мне нужно построить:
Some text <b>with tags</b> might go here.
Also there are paragraphs
More text can go without paragraphs
Element.text
возвращает только все содержимое div. Element.ownText
- все, что не внутри дочерних элементов. Оба ошибаются. Переборем children
игнорирует текстовые узлы.
есть ли способ перебирать содержимое элемента для получения текстовых узлов. Е. Г.
- текстовый узел-Некоторый текст
- узел - с теги
- текстовый узел - может зайти сюда.
- Node
- также есть абзацы
- текстовый узел - больше текста может идти без абзацев
- узел
-
4 ответов
for (Element el : doc.select("body").select("*")) {
for (TextNode node : el.textNodes()) {
node.text() ));
}
}
Если вы хотите только текст (без тегов) мое решение ниже.
Выход есть:
Здесь может быть текст с тегами. Также есть параграфы. Больше текста может идти без абзацев
public static void main(String[] args) throws IOException {
String str =
"<div>"
+ " Some text <b>with tags</b> might go here."
+ " <p>Also there are paragraphs.</p>"
+ " More text can go without paragraphs<br/>"
+ "</div>";
Document doc = Jsoup.parse(str);
Element div = doc.select("div").first();
StringBuilder builder = new StringBuilder();
stripTags(builder, div.childNodes());
System.out.println("Text without tags: " + builder.toString());
}
/**
* Strip tags from a List of type <code>Node</code>
* @param builder StringBuilder : input and output
* @param nodesList List of type <code>Node</code>
*/
public static void stripTags (StringBuilder builder, List<Node> nodesList) {
for (Node node : nodesList) {
String nodeName = node.nodeName();
if (nodeName.equalsIgnoreCase("#text")) {
builder.append(node.toString());
} else {
// recurse
stripTags(builder, node.childNodes());
}
}
}
вы можете использовать TextNode для этого:
List<TextNode> bodyTextNode = doc.getElementById("content").textNodes();
String html = "";
for(TextNode txNode:bodyTextNode){
html+=txNode.text();
}