繁体   English   中英

在 Jsoup 中解析 html

[英]Parsing html in Jsoup

我试图在这里使用 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 片段会自动添加<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之前摆脱第一个换行符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM