在 Jsoup 中解析 html
Parsing html in Jsoup
我正在尝试使用 jsoup 在此处解析 html 标签。我是jsoup的新手。基本上我需要解析标签并获取这些标签内的文本并应用 class 属性中提到的样式。
我正在为此创建一个 SpannableStringBuilder,我可以创建子字符串、应用样式并将它们与没有样式的文本附加在一起。
String str = "There are <span class='newStyle'> two </span> workers from the <span class='oldStyle'>Front of House</span>";
SpannableStringBuilder text = new SpannableStringBuilder();
if (value.contains("</span>")) {
Document document = Jsoup.parse(value);
Elements elements = document.getElementsByTag("span");
if (elements != null) {
int i = 0;
int start = 0;
for (Element ele : elements) {
String styleName = type + "." + ele.attr("class");
text.append(ele.text());
int style = context.getResources().getIdentifier(styleName, "style", context.getPackageName());
text.setSpan(new TextAppearanceSpan(context, style), start, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.append(ele.nextSibling().toString());
start = text.length();
i++;
}
}
return text;
}
我不确定如何解析不在 "There are" 和 "worker from the" 等任何标记之间的字符串。
需要输出如:
- There are
- <span class='newStyle'> two </span>
- workers from the
- <span class='oldStyle'>Front of House</span>
完整答案:您可以通过获取 childNodes()
来获取标签外的文本。这样你就得到了List<Node>
。请注意,我选择 body
是因为您的 HTML 片段没有任何父元素,并且使用 jsoup 解析 HTML 片段会自动添加 <html>
和 <body>
。
如果 Node
仅包含类型为 TextNode
的文本,您可以使用 toString()
.
获取内容
否则,您可以将其转换为 Element
并使用 element.text()
.
获取文本
String str = "There are <span class='newStyle'> two </span> workers from the <span class='oldStyle'>Front of House</span>";
Document doc = Jsoup.parse(str);
Element body = doc.selectFirst("body");
List<Node> childNodes = body.childNodes();
for (int i = 0; i < childNodes.size(); i++) {
Node node = body.childNodes().get(i);
if (node instanceof TextNode) {
System.out.println(i + " -> " + node.toString());
} else {
Element element = (Element) node;
System.out.println(i + " -> " + element.text());
}
}
输出:
0 ->
There are
1 -> two
2 -> workers from the
3 -> Front of House
顺便说一句:我不知道如何去掉 There are
之前的第一个换行符。
我正在尝试使用 jsoup 在此处解析 html 标签。我是jsoup的新手。基本上我需要解析标签并获取这些标签内的文本并应用 class 属性中提到的样式。
我正在为此创建一个 SpannableStringBuilder,我可以创建子字符串、应用样式并将它们与没有样式的文本附加在一起。
String str = "There are <span class='newStyle'> two </span> workers from the <span class='oldStyle'>Front of House</span>";
SpannableStringBuilder text = new SpannableStringBuilder();
if (value.contains("</span>")) {
Document document = Jsoup.parse(value);
Elements elements = document.getElementsByTag("span");
if (elements != null) {
int i = 0;
int start = 0;
for (Element ele : elements) {
String styleName = type + "." + ele.attr("class");
text.append(ele.text());
int style = context.getResources().getIdentifier(styleName, "style", context.getPackageName());
text.setSpan(new TextAppearanceSpan(context, style), start, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.append(ele.nextSibling().toString());
start = text.length();
i++;
}
}
return text;
}
我不确定如何解析不在 "There are" 和 "worker from the" 等任何标记之间的字符串。
需要输出如:
- There are
- <span class='newStyle'> two </span>
- workers from the
- <span class='oldStyle'>Front of House</span>
完整答案:您可以通过获取 childNodes()
来获取标签外的文本。这样你就得到了List<Node>
。请注意,我选择 body
是因为您的 HTML 片段没有任何父元素,并且使用 jsoup 解析 HTML 片段会自动添加 <html>
和 <body>
。
如果 Node
仅包含类型为 TextNode
的文本,您可以使用 toString()
.
获取内容
否则,您可以将其转换为 Element
并使用 element.text()
.
String str = "There are <span class='newStyle'> two </span> workers from the <span class='oldStyle'>Front of House</span>";
Document doc = Jsoup.parse(str);
Element body = doc.selectFirst("body");
List<Node> childNodes = body.childNodes();
for (int i = 0; i < childNodes.size(); i++) {
Node node = body.childNodes().get(i);
if (node instanceof TextNode) {
System.out.println(i + " -> " + node.toString());
} else {
Element element = (Element) node;
System.out.println(i + " -> " + element.text());
}
}
输出:
0 ->
There are
1 -> two
2 -> workers from the
3 -> Front of House
顺便说一句:我不知道如何去掉 There are
之前的第一个换行符。