2012-12-18 42 views
1

我想分析html页面的结构。对于一个页面,我把它作为一个字符串,我想删除文本并只保留html结构。我不想使用DOM解析器,而且我需要一些健壮的工具,它不仅适用于普通的html,而且还适用于xhtml。我知道正则表达式足以去除字符串中的html标签,但是它们可以用于去除文本并仅保留html标签吗?如何从Java和Html字符串中去除文本

您是否知道我可以使用的其他选项/框架?

+0

我会明确地追求一个DOM解析器... –

+0

我想避免一个DOM解析的原因是,我想将结果的html用作字符串而不是DOM。但是,我可以使用DOM解析器去除文本,然后将其作为字符串获取。这也行得通,我只想知道我有什么其他选择。 – adiian

回答

0

您是否知道我可以使用的其他选项/框架?

你可能想看看JSoup。似乎旨在解决这种类型的问题。

2

我怀疑有一个简单的方法来使用正则表达式来做到这一点。

Jericho是一个相当整洁的HTML解析器,占用空间小,而且没有额外的外部库。

+0

我以前一直在使用Jericho,并且尝试了我的特定任务,但它似乎不适合更改html结构。例如,你需要一个特殊的TextExtractor类来访问文本的html标签。似乎很难删除每个节点中的文本,因为似乎没有任何更改内部html的方法。我应该尝试JSoup,它似乎更适合我的目的。 – adiian

0

如果您之前已经剥离了标签,则知道其基本要点是剥离<和>之间的所有内容。删除文本是非常相似的,除非你删除了>和<之间的所有内容。所以是的,正则表达式可以很好地为您提供剥离文本并留下标签的功能。如果你不想处理它们,它们也可以用来去除标签属性。

0

这可能会给你一个体面的开始。我对HTML没有太多的经验,所以我不知道除了<标签>还有其他什么东西可以解析出来。

public static void main(String[] args){ 
    String html = "<body> text text text text </body>"; 
    String htmlTags = null; 
    char c; 
    for(int i = 0 ; i < html.length() ; i++){ 
     c = html.charAt(i); 
     if(tagStart(Character.toString(c))){ 
      for(int j = i ; j < html.length() ; j++){ 
       if(htmlTags != null){ 
        htmlTags += Character.toString(html.charAt(j)); 
       }else{ 
        htmlTags = Character.toString(html.charAt(j)); 
       } 
       c = html.charAt(j); 
       if(tagStop(Character.toString(c))){ 
        break; 
       } 
      } 
     } 
    } 
} 

private static boolean tagStart(String check){ 
    if(check.equals("<")){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

private static boolean tagStop(String check){ 
    if(check.equals(">")){ 
     return true; 
    }else{ 
     return false; 
    } 
} 
+0

这是一个很好的开始如果我没有任何其他健壮的方法。有几件事我会尝试DOM或任何其他解析器/库,甚至直接解析之前的正则表达式。首先,我必须保留包含的“文本”,如

0

线沿线的东西:

pageSource.replaceAll(">.*<", "><"); 

应该让你开始。