4

我正在尝试从字符串中删除所有 HTML 元素。不幸的是,我不能使用正则表达式,因为我是在黑莓平台上开发的,还不支持正则表达式。

有没有其他方法可以从字符串中删除 HTML?我在某处读到您可以使用 DOM Parser,但我找不到太多关于它的信息。

带有 HTML 的文本:

<![CDATA[As a massive asteroid hurtles toward Earth, NASA head honcho Dan Truman (<a href="http://www.netflix.com/RoleDisplay/Billy_Bob_Thornton/20000303">Billy Bob Thornton</a>) hatches a plan to split the deadly rock in two before it annihilates the entire planet, calling on Harry Stamper (<a href="http://www.netflix.com/RoleDisplay/Bruce_Willis/99786">Bruce Willis</a>) -- the world's finest oil driller -- to head up the mission. With time rapidly running out, Stamper assembles a crack team and blasts off into space to attempt the treacherous task. <a href="http://www.netflix.com/RoleDisplay/Ben_Affleck/20000016">Ben Affleck</a> and <a href="http://www.netflix.com/RoleDisplay/Liv_Tyler/162745">Liv Tyler</a> co-star.]]>

没有 HTML 的文本:

当一颗巨大的小行星冲向地球时,美国宇航局局长丹·杜鲁门 (比利·鲍勃·桑顿饰) 制定了一项计划,在这颗致命的岩石毁灭整个星球之前将其一分为二,并呼吁世界上最好的石油钻探员哈里·斯坦普 (布鲁斯·威利斯饰) ——领导任务。随着时间的流逝,斯坦普组建了一支精锐的团队,并飞向太空以尝试这项危险的任务。本·阿弗莱克和丽芙·泰勒联合主演。

谢谢!

4

4 回答 4

4

在野外解析 HTML有很多细微差别,其中一个更有趣的是那里的许多页面不遵循任何标准。这就是说,如果您的所有 HTML 都像您的示例一样简单,那么这样的内容就足够了:

    char[] cs = s.toCharArray();
    StringBuilder sb = new StringBuilder();
    boolean tag = false;
    for (int i=0; i<cs.length; i++) {
        switch(cs[i]) {
            case '<': if ( ! tag) { tag = true; break; }
            case '>': if (tag) { tag = false; break; }
            case '&': i += interpretEscape(cs, i, sb); break;
            default: if ( ! tag) sb.append(cs[i]);
        }
    }
    System.err.println(sb);

WhereinterpretEscape()应该知道如何将 HTML 转义符转换为&gt;对应的字符,并跳过所有字符直到结尾;

于 2010-03-21T23:24:31.317 回答
4

我不能使用正则表达式,因为我在黑莓平台上开发

您不能使用正则表达式,因为 HTML 是一种递归语言,而正则表达式无法处理这些。

你需要一个解析器。

于 2010-03-22T09:25:37.207 回答
1

如果您可以添加外部 jar,您可以尝试使用这两个小库:

它们都允许你剥离一切。

我多次使用 jericho 来剥离你定义的提取器:

class HTMLStripExtractor extends TextExtractor
{
    public HTMLStripExtractor(Source src)
    {       
        super(src)  
        src.setLogger(null)
    }

    public boolean excludeElement(StartTag startTag)
    {
        return startTag.getName() != HTMLElementName.A
    }
}
于 2010-03-21T23:10:41.467 回答
1

我会尝试以另一种方式解决这个问题,从 HTML 创建一个 DOM 树,然后从树中提取字符串:

  • 使用TagSoup之类的库来解析 HTML,同时将其清理为接近 XHTML。
  • 在流式传输清理后的 XHTML 时,提取所需的文本。
于 2010-03-21T23:14:20.990 回答