如何从Java中的html字符串中按顺序获取所有html标记

时间:2012-11-23 12:41:04

标签: java regex html-parsing jsoup

<td valign="top" width="230">
<div>
<b><a href="http://www.cs.cornell.edu/johannes/">Johannes Gehrke</a></b>
</div>
<div class="small">
Professor<br>Computer Science, CS Field Member<br>Director of Graduate Studies<br>
Ph.D., Univ of Wisconsin, Madison, 1999<br><b>Research focus:</b> Database systems, data mining, and data privacy
</div>
</td>

我想从给定的html字符串中获取标记序列。最简单的方法是什么?例如,将上面的html字符串作为输入,我希望我的方法输出一个字符串数组,即[td,div,b,a,div,br,br,br,br,b]

我已经尝试Jsoup来解析html字符串,但似乎无法捕获像br这样的标记。我想知道任何其他Java库可以为我做这个技巧。最后的手段是使用正则表达式技术。如果某人能够为此目的提出一个简洁的正则表达式,它也会这样做。

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式:

    Pattern p = Pattern.compile("<([^\\s>/]+)");
    Matcher m = p.matcher(txt);
    while(m.find()) {
        String tag = m.group(1);
        System.out.println(tag);
    }

答案 1 :(得分:0)

使用JSoup解析字符串后,使用其getAllElements()方法,迭代结果,并为每个元素调用tagName()

答案 2 :(得分:0)

我会考虑使用HTMLEditorKit.Parser。尽管Swing只能呈现HTML 3.2,但解析器应该读取并保留所有标记:

public List<String> getTags(Reader reader)
throws IOException {

    final List<String> tags = new ArrayList<>();

    HTMLEditorKit.ParserCallback callback =
        new HTMLEditorKit.ParserCallback() {
            @Override
            public void handleStartTag(HTML.Tag tag,
                                       MutableAttributeSet attributes,
                                       int pos) {
                super.handleStartTag(tag, attributes, pos);
                tags.add(tag.toString());
            }
        };

    HTMLEditorKit.Parser parser = new ParserDelegator();
    parser.parse(reader, callback, true);

    return tags;
}