代码之家  ›  专栏  ›  技术社区  ›  user2234

在Jsoup中解析html

  •  0
  • user2234  · 技术社区  · 5 年前

    我试图在这里使用jsoup解析html标签。我是jsoup的新手。基本上,我需要解析标签,获取标签中的文本,并应用class属性中提到的样式。

    我正在创建一个SpanbableStringBuilder,我可以创建子字符串,应用样式,并将它们与没有样式的文本附加在一起。

    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>
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Krystian G Adio Azeez    5 年前

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