解析所有HTML标签/非文本; Java的

时间:2011-12-10 01:28:33

标签: java regex html-parsing jsoup

从网页上获取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 个答案:

答案 0 :(得分:1)

看起来jsoup并没有提供一个明显的方法来做到这一点,所以我通过编辑源代码并将方法text_mod()添加到Element来快速破解。这种方法有局限性,但如果您觉得它很有用,可以在http://ge.tt/9PAMpzA下载修改过的jar。

以下是补充:

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.

答案 1 :(得分:0)

正则表达式通常不适用于任意HTML,因为正则表达式无法完全解析HTML(技术原因称为抽取引理,这对于手头的任务并不重要。)

我建议从一个XML解析器开始(假设你的HTML没有做任何太奇怪的事情),并向下看解析树,查看可显示标签中的数据。 XPath表达式在这里非常有用。

答案 2 :(得分:0)

在使用DOM的JavaScript中,您可以获取具有DOM元素的textContentinnerText属性的任何HTML元素的文本。如果对BODY元素执行此操作,则您具有该页面的“文本”版本。

var body = document.getElementsByTagName('body')[0];
var bodyText = body.textContent || body.innerText;