jsoup 和nekohtml,htmlparser解析html

仅以此文章表达介绍下将html解析成纯文本的多种方式 
1.jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。 
可参考: http://www.iteye.com/topic/1010581  

Java代码   收藏代码
  1. public  void parse(String urlStr) {  
  2.     // 返回结果初始化。  
  3.   
  4.     Document doc = null;  
  5.     try {  
  6.         doc = Jsoup  
  7.                 .connect(urlStr)  
  8.                 .userAgent(  
  9.                         "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)"// 设置User-Agent  
  10.                 .timeout(5000// 设置连接超时时间  
  11.                 .get();  
  12.     } catch (MalformedURLException e) {  
  13.         log.error( e);  
  14.         return ;  
  15.     } catch (IOException e) {  
  16.         if (e instanceof SocketTimeoutException) {  
  17.             log.error( e);  
  18.                                return ;  
  19.         }  
  20.         if(e instanceof UnknownHostException){  
  21.             log.error(e);  
  22.             return ;  
  23.         }  
  24.         log.error( e);  
  25.         return ;  
  26.     }  
  27.     system.out.println(doc.title());  
  28.     Element head = doc.head();  
  29.     Elements metas = head.select("meta");  
  30.     for (Element meta : metas) {  
  31.         String content = meta.attr("content");  
  32.         if ("content-type".equalsIgnoreCase(meta.attr("http-equiv"))  
  33.                 && !StringUtils.startsWith(content, "text/html")) {  
  34.             log.debug( urlStr);  
  35.             return ;  
  36.         }  
  37.         if ("description".equalsIgnoreCase(meta.attr("name"))) {  
  38.             system.out.println(meta.attr("content"));  
  39.         }  
  40.     }  
  41.     Element body = doc.body();  
  42.     for (Element img : body.getElementsByTag("img")) {  
  43.         String imageUrl = img.attr("abs:src");//获得绝对路径  
  44.         for (String suffix : IMAGE_TYPE_ARRAY) {  
  45.             if(imageUrl.indexOf("?")>0){  
  46.                 imageUrl=imageUrl.substring(0,imageUrl.indexOf("?"));  
  47.             }  
  48.             if (StringUtils.endsWithIgnoreCase(imageUrl, suffix)) {  
  49.                 imgSrcs.add(imageUrl);  
  50.                 break;  
  51.             }  
  52.         }  
  53.     }  
  54. }  



2 nekohtml 
Java代码   收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.FileReader;  
  3.   
  4. import org.cyberneko.html.parsers.DOMParser;  
  5. import org.w3c.dom.Document;  
  6. import org.w3c.dom.Element;  
  7. import org.w3c.dom.Node;  
  8. import org.w3c.dom.NodeList;  
  9. import org.xml.sax.InputSource;  
  10.   
  11.   
  12. public class Demo {  
  13. public static String TextExtractor(Node root){  
  14.    //若是文本节点的话,直接返回  
  15.    if (root.getNodeType() == Node.TEXT_NODE) {  
  16.     return root.getNodeValue().trim();  
  17.    }  
  18.    if(root.getNodeType() == Node.ELEMENT_NODE) {  
  19.     Element elmt = (Element) root;  
  20.     //抛弃脚本  
  21.     if (elmt.getTagName().equals("STYLE")  
  22.       || elmt.getTagName().equals("SCRIPT"))  
  23.      return "";  
  24.      
  25.     NodeList children = elmt.getChildNodes();  
  26.     StringBuilder text = new StringBuilder();  
  27.     for (int i = 0; i < children.getLength(); i++) {  
  28.      text.append(TextExtractor(children.item(i)));  
  29.     }  
  30.     return text.toString();  
  31.    }  
  32.    //对其它类型的节点,返回空值  
  33.    return "";  
  34. }  
  35. public static void main(String[] args) throws Exception{  
  36.    //生成html parser  
  37.    DOMParser parser = new DOMParser();  
  38.    //设置网页的默认编码  
  39.    parser.setProperty(  
  40.      "http://cyberneko.org/html/properties/default-encoding ",  
  41.      "gb18030");  
  42.    //input file  
  43.    BufferedReader in = new BufferedReader(new FileReader("input.htm"));  
  44.    parser.parse(new InputSource(in));  
  45.    Document doc = parser.getDocument();  
  46.    //获得body节点,以此为根,计算其文本内容  
  47.    Node body = doc.getElementsByTagName("BODY").item(0);  
  48.    System.out.println(TextExtractor(body));  
  49. }  
  50. }  

另外强调下,在用nekohtml对html页面进行解析的时候,经常会碰到&nbsp这样的符号经解析之后变成了?,在网上搜索了下答案之后发现了解决方案。 
方案一:先将&nbsp;用空字符串取代。 
方案二:原来neko能够自动对这种类型的HTML字符实体进行分析,但是资源文件却不包含对&nbsp;的定义。在nekohtml.jar中找到了它使用的资源文件HTMLlat1.properties,在其中加入了一行: nbsp=\u00a0,问题就解决了。 


3.htmlparser 
  用法差不多。 

好吧,有人总结的更全面 
http://blessed24.iteye.com/blog/865197
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设置解析器参数   为了更加精确的控制解析的动作,nekohtml提供了相应的设置函数。如下列: // settings on HTMLConfiguration org.apache.xerces.xni.parser.XMLParserConfiguration config = new org.cyberneko.html.HTMLConfiguration(); config.setFeature("http://cyberneko.org/html/features/augmentations", true); config.setProperty("http://cyberneko.org/html/properties/names/elems", "lower"); // settings on DOMParser org.cyberneko.html.parsers.DOMParser parser = new org.cyberneko.html.parsers.DOMParser(); parser.setFeature("http://cyberneko.org/html/features/augmentations", true); parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");nekohtml功能(feature)列表 功能 默认值 描述 http://cyberneko.org/html/features/balance-tags True 是否允许增补缺失的标签。如果要以XML方式操作HTML文件,此值必须为真。此处提供设置功能,为了性能的原因。 http://cyberneko.org/html/features/balance-tags/ignore-outside-content False 是否忽略文档根元素以后的数据。如果为false,<html>和<bod>被忽略,所有的内容都被解析。 http://cyberneko.org/html/features/document-fragment False 解析HTML片段时是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。 http://apache.org/xml/features/scanner/notify-char-refs False 当遇到字符实体引用(如&#x20;)是否将(#x20)报告给相应地文档处理器。 http://apache.org/xml/features/scanner/notify-builtin-refs False 当遇到XML内建的字符实体引用(如&amp;)是否将(amp)报告给相应地文档处理器。 http://cyberneko.org/html/features/scanner/notify-builtin-refs False 当遇到HTML内建的字符实体引用(如&copy;)是否将(copy)报告给相应地文档处理器。 http://cyberneko.org/html/features/scanner/script/strip-comment-delims False 是否剥掉<script>元素中的<!-- -->等注释符。 http://cyberneko.org/html/features/augmentations False 是否将与HTML事件有关的infoset项包括在解析管道中。 http://cyberneko.org/html/features/report-errors False 是否报告错误。nekohtml属性列表 属性 默认值 值域 描述 http://cyberneko.org/html/properties/filters null XMLDocumentFilter[] 在解析管道的最后按数组顺序追加自定义的处理组件(过滤器),必须为数组类型。 http://cyberneko.org/html/properties/default-encoding Windows-1252 IANA encoding names 默认的HTML文件编码 http://cyberneko.org/html/properties/names/elems upper upper,lower,match 如果整理识别出的元素名称 http://cyberneko.org/html/properties/names/attrs lower upper,lower,no-change 如果整理识别出的属性名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值