首页 > 解决方案 > 在 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>

标签: javaandroidjsoup

解决方案


完整答案:您可以通过获取标签之外的文本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


推荐阅读