Класс java.io.Reader, который может пропускать теги HTML? - PullRequest
1 голос
/ 16 сентября 2011

Мне нужно удалить HTML из больших объемов текста.Было бы здорово, если бы я мог найти класс, который реализует java.io.Reader, который обернул бы другой Reader, и преобразовал бы текст так, чтобы пропустить все теги HTML (или, возможно, заменить их пробелами).Он должен быть в состоянии справиться с плохо сформированным HTML.

Производительность важна.Мне нужно обработать много гигабайт текста как можно быстрее.Обычный способ сделать это - прочитать мой HTML-код в строку, проанализировать его в дереве DOM и перебирать узлы, извлекающие текст по ходу работы.К сожалению, это слишком медленно.Я думаю, что реализация должна быть основана на каком-то низкоуровневом лексере.

Кто-нибудь знает библиотеку, которая может это сделать?

Ответы [ 5 ]

1 голос
/ 16 сентября 2011

Я предполагаю, что вы хотите весь текст, поэтому хакерское регулярное выражение, которое получает большинство вещей, не подходит. Это означает, что вам нужно пройти хотя бы первую часть синтаксического анализа, но вы хотите, чтобы библиотека выполняла как можно меньше после этого.

Вы можете использовать tagsoup , который дает вам хороший низкоуровневый интерфейс саксофона. Просто игнорируйте теги и просто собирайте значения текстовых узлов. Легко и быстро, насколько это возможно.

1 голос
/ 16 сентября 2011

В прошлом я успешно использовал JTidy .

Он делает больше, чем вам нужно, поскольку по сути это DOM-парсер для реального HTML. Что хорошо, так это то, что он крепкий; он может обрабатывать причуды в разметке так же, как браузер.

0 голосов
/ 17 сентября 2011

Обычный способ на самом деле состоит в том, чтобы анализировать HTML-код непосредственно из файла, без промежуточных строк, тратящих время и пространство, но, как говорили другие авторы, сначала вам придется привести в порядок HTML-код с помощью JTidy, NekoHMTL.и т. д. Оттуда я бы, вероятно, использовал XSLT, но, возможно, нет, если бы требовалась предельная производительность.У вас все еще есть выбор парсеров: парсер SAX или StAX будет быстрее и эффективнее, чем парсер DOM.

0 голосов
/ 16 сентября 2011

Может быть, ParserCallback быстрее, чем создание DOM?

import java.io.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;

public class ParserCallbackText extends HTMLEditorKit.ParserCallback
{
    public void handleText(char[] data, int pos)
    {
        System.out.println( data );
    }

    public static void main(String[] args)
        throws Exception
    {
        Reader reader = getReader(args[0]);
        ParserCallbackText parser = new ParserCallbackText();
        new ParserDelegator().parse(reader, parser, true);
    }

    static Reader getReader(String uri)
        throws IOException
    {
        // Retrieve from Internet.
        if (uri.startsWith("http:"))
        {
            URLConnection conn = new URL(uri).openConnection();
            return new InputStreamReader(conn.getInputStream());
        }
        // Retrieve from file.
        else
        {
            return new FileReader(uri);
        }
    }
}
0 голосов
/ 16 сентября 2011

Для скорости вам, вероятно, понадобится потоковый парсер.Может быть Validator.nu ?

...