Разбор html в Jsoup - PullRequest
       1

Разбор html в Jsoup

1 голос
/ 09 января 2020

Я пытаюсь проанализировать html теги здесь, используя jsoup. Я новичок в 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
- <span class='newStyle'> two </span>
- workers from the
- <span class='oldStyle'>Front of House</span>

1 Ответ

1 голос
/ 10 января 2020

Полный ответ: вы можете получить текст вне тегов, набрав childNodes(). Таким образом, вы получите List<Node>. Примечание. Я выбираю body, потому что у вашего HTML фрагмента нет родительского элемента, а при разборе HTML фрагмента с помощью jsoup автоматически добавляются <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());
        }
    }

output:

0 -> 
There are 
1 -> two
2 ->  workers from the 
3 -> Front of House

Кстати: я не знаю, как избавиться от первого разрыва строки до There are.

...