Java удалить HTML из String без регулярных выражений - PullRequest
4 голосов
/ 22 марта 2010

Я пытаюсь удалить все элементы HTML из строки. К сожалению, я не могу использовать регулярные выражения, потому что я работаю на платформе Blackberry, и регулярные выражения еще не поддерживаются.

Есть ли другой способ удалить 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 голосов
/ 22 марта 2010

Я не могу использовать регулярные выражения потому что я развиваю на Платформа Blackberry

Вы не можете использовать регулярные выражения, потому что HTML является рекурсивным языком, а регулярные выражения не могут их обработать.

Вам нужен парсер.

4 голосов
/ 22 марта 2010

Есть много нюансов для анализа 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);

Где interpretEscape() должен знать, как преобразовать экранированные символы HTML, такие как &gt;, в их символьные аналоги и пропустить все символы до конца ;.

1 голос
/ 22 марта 2010

Я бы попытался решить эту проблему с другой стороны, создать дерево DOM из HTML, а затем извлечь строку из дерева:

  • Использовать такую ​​библиотеку, как TagSoup анализировать HTML при очистке, чтобы он был близок к XHTML.
  • При потоковой передаче очищенного XHTML извлекайте нужный текст.
1 голос
/ 22 марта 2010

Если вы можете добавить внешние jar, вы можете попробовать эти две маленькие библиотеки:

  • tagsoup , это синтаксический анализатор
  • jericho html, еще один небольшой html-парсер

они оба позволяют вам все удалять.

Я много раз использовал jericho, чтобы лишить вас определения экстрактора так, как вам нравится:

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

    public boolean excludeElement(StartTag startTag)
    {
        return startTag.getName() != HTMLElementName.A
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...