Некоторые помогают очистить страницу в Java - PullRequest
6 голосов
/ 02 января 2011

Мне нужно почистить веб-страницу с помощью Java, и я прочитал, что регулярное выражение - довольно неэффективный способ сделать это, и для навигации по нему нужно поместить его в документ DOM.

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

Не могли бы вы показать мне, как скрести эту таблицу в массив?Я могу попытаться выяснить мой путь оттуда.Фрагмент / пример тоже подойдет.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 02 января 2011

Вы можете попробовать jsoup: Java HTML Parser .Это отличная библиотека с хорошими примерами кодов.

4 голосов
/ 02 января 2011
  1. Преобразование веб-страницы, которую вы пытаетесь скопировать, в документ XHTML . Есть несколько вариантов сделать это с Java, например JTidy и HTMLCleaner . Эти инструменты также автоматически исправляют некорректный HTML (например, закрывают закрытые теги). Оба работают очень хорошо, но я предпочитаю JTidy, потому что он лучше интегрируется с Java DOM API;
  2. Извлечение необходимой информации с использованием выражений XPath .

Вот рабочий пример использования JTidy и предоставленной вами веб-страницы, используемой для извлечения всех имен файлов из таблицы.

public static void main(String[] args) throws Exception {
    // Create a new JTidy instance and set options
    Tidy tidy = new Tidy();
    tidy.setXHTML(true); 

    // Parse an HTML page into a DOM document
    URL url = new URL("http://www.cs.grinnell.edu/~walker/fluency-book/labs/sample-table.html");        
    Document doc = tidy.parseDOM(url.openStream(), System.out);

    // Use XPath to obtain whatever you want from the (X)HTML
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile("//td[@valign = 'top']/a/text()");
    NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
    List<String> filenames = new ArrayList<String>();
    for (int i = 0; i < nodes.getLength(); i++) {
        filenames.add(nodes.item(i).getNodeValue()); 
    }

    System.out.println(filenames);
}

Результат будет [Integer Processing:, Image Processing:, A Photo Album:, Run-time Experiments:, More Run-time Experiments:], как и ожидалось.

Еще один крутой инструмент, который вы можете использовать: Web Harvest. Он в основном делает все, что я делал выше, но использует файл XML для настройки конвейера извлечения.

0 голосов
/ 02 января 2011

Если все, что вы делаете - это извлекаете таблицу из файла данных, регулярное выражение будет вполне приемлемым и даже лучше, чем использование документа DOM. Документы DOM занимают много памяти (особенно для действительно больших таблиц данных), поэтому вам, вероятно, понадобится SAX-анализатор для больших документов.

0 голосов
/ 02 января 2011

Regex, безусловно, путь. Построение DOM слишком сложно и само по себе требует большого количества разбора текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...