java - 在 Jsoup 中解析 html
问题描述
我正在尝试使用 jsoup 在这里解析 html 标签。我是jsoup的新手。基本上我需要解析标签并获取这些标签内的文本并应用类属性中提到的样式。
我正在创建一个 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>
并<body>
自动解析 HTML 片段。
如果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
。
推荐阅读
- request - Scrapy:从解析函数继续处理结果
- javascript - 单击时的 jQuery 类适用于桌面,但不适用于移动设备
- javascript - 使用自己的 ng-model 动态添加输入
- three.js - 如何在three.js中围绕对象的中心旋转?
- c++ - google or-tools glop:如何创建指向 const 对象的指针数组?
- r - 在R中将箱线图与直方图组合/叠加
- .htaccess - 无法使用.htaccess 重定向路径?
- python - 合并两个字典并在 Python 中保留重复键的值
- mysql - 需要值为 UserID 或 NULL 的所有 MySQL 结果 - 没有额外的 UserID
- sql - 大型记录集的复杂 SQL 查询