在 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 之前的第一个换行符。