【问题标题】:Parsing html in Jsoup在 Jsoup 中解析 html
【发布时间】:2020-04-26 16:01:18
【问题描述】:

我正在尝试使用 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>

【问题讨论】:

标签: java android jsoup


【解决方案1】:

完整答案:您可以通过获取childNodes() 来获取标签之外的文本。这样你就获得了List&lt;Node&gt;。请注意,我选择 body 是因为您的 HTML 片段没有任何父元素,并且使用 jsoup 解析 HTML 片段会自动添加 &lt;html&gt;&lt;body&gt;
如果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之前的第一个换行符。

【讨论】:

  • 谢谢,我使用 Parser.xmlParser 来避免 Jsoup 添加的标签。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2013-03-26
  • 1970-01-01
相关资源
最近更新 更多