Разбор всех HTML-тегов / нетекстовых; Джава - PullRequest
0 голосов
/ 10 декабря 2011

Каков наилучший способ взять html с веб-страницы, убрать все теги HTML / код javascript / все, что не является отображаемым текстом, и, наконец, иметь возможность возвращать эту информацию с некоторыми разделителями для каждого фрагмента текста, который был упакован в другой тег HTML?

Сначала я попробовал использовать JSOUP:

Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/Main_Page").get();
String html = doc.body().text();

Это хорошо для удаления всего нетекстового текста, но не возвращает мне никакого разделения.

В настоящее время я пытаюсь использовать регулярные выражения, такие как:

html.replaceAll("\\<.*?\\>", "")

Но я на самом деле не знаком с регулярными выражениями, и у меня проблемы с удалением javascript. Однако в этом методе есть новые строки, которые я могу использовать, чтобы отследить отдельные текстовые группы из разных упаковок тегов.

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

Спасибо

Ответы [ 3 ]

1 голос
/ 10 декабря 2011

Похоже, jsoup не предоставляет сразу очевидный способ сделать это, поэтому я быстро взломал, отредактировав исходный код и добавив метод text_mod() в Element. У этого подхода есть ограничения, но если вы сочтете его полезным, вы можете скачать модифицированный jar по адресу http://ge.tt/9PAMpzA.

Вот дополнение:

public String text_mod(){
    StringBuilder sb = new StringBuilder();
    text_mod(sb);
    return sb.toString().trim().replaceAll("\n+", "\n");
}

private void text_mod(StringBuilder accum) {
    appendWhitespaceIfBr(this, accum);

    for (Node child : childNodes) {
        if (child instanceof TextNode) {
            TextNode textNode = (TextNode) child;
            appendNormalisedText(accum, textNode);
        } else if (child instanceof Element) {
            Element element = (Element) child;
    //        if (accum.length() > 0 && element.isBlock() && !TextNode.lastCharIsWhitespace(accum))
    //            accum.append("\n");
            element.text_mod(accum);
        }
        accum.append("\n");
    }
}

Например, попробуйте это:

import org.jsoup.Jsoup;

public class Test {
    public static void main(String[] args){
        String html = "<html><head><title>HTML</title></head>"
              + "<body><p>Paragraph 1.</p><p>Paragraph 2.</p></body></html>";
        System.out.println(Jsoup.parse(html).body().text_mod());
    }
}

Я получаю

Paragraph 1.
Paragraph 2.
0 голосов
/ 10 декабря 2011

В JavaScript с DOM вы можете получить текст любого HTML-элемента со свойствами textContent или innerText элемента DOM.Если вы сделаете это для элемента BODY, у вас будет «текстовая» версия страницы.

var body = document.getElementsByTagName('body')[0];
var bodyText = body.textContent || body.innerText;
0 голосов
/ 10 декабря 2011

Регулярные выражения обычно не работают для произвольного HTML, так как регулярные выражения не могут полностью проанализировать HTML (техническая причина называется леммой прокачки, которая не важна для рассматриваемой задачи).

Iрекомендую начать с синтаксического анализатора XML (при условии, что ваш HTML не делает ничего странного) и искать в дереве разбора данные, которые идут в отображаемых тегах.Здесь очень полезны выражения XPath.

...