`
sysu_zeh
  • 浏览: 28200 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

java获取网页主信息之三:html to tree

阅读更多

对html文件进行扫描,将html元素抽象出来形成树。

  1. package Source;   
  2.   
  3. import java.io.*;   
  4.   
  5. public class HTML2Tree   
  6. {   
  7.  //构造方法   
  8.   
  9.     public HTML2Tree()   
  10.     {   
  11.         tree = new HTree();   
  12.         myStack = new Stack();   
  13.     }   
  14.     //主要处理方法,将一个html文件转换成一个树   
  15.     public void main(String filename)   
  16.     {   
  17.      //html文件   
  18.         File f = new File(filename);   
  19.         String s = "";   
  20.         //标志类型   
  21.         String tag = "";   
  22.         //读取的当前位置   
  23.         int pos = 0;   
  24.         //开始位置   
  25.         int start = 0;   
  26.         int num = 0;   
  27.         int status = 0;   
  28.         boolean getNewLine = true;   
  29.         //html为根节点   
  30.         insert("html");   
  31.         try  
  32.         {   
  33.             BufferedReader fis = new BufferedReader(new FileReader(f));   
  34.             do  
  35.             {   
  36.              //获取新的一行并初始化要处理的字符串   
  37.                 if(getNewLine)   
  38.                 {   
  39.                     s = fis.readLine();   
  40.                     if(s == nullbreak;   
  41.                     num++;   
  42.                     if(s.equalsIgnoreCase("")) continue;   
  43.                     s = s.toLowerCase();   
  44.                     pos = 0;   
  45.                 }   
  46.                 //状态0,还在html层,并一直读至body块为止   
  47.                 if(status == 0)   
  48.                 {   
  49.                     pos = s.indexOf(");   
  50.                     if(pos < 0) getNewLine = true;   
  51.                     else  
  52.                     {   
  53.                      //body入栈   
  54.                         insert("body");   
  55.                         status = 1;   
  56.                         pos++;   
  57.                         getNewLine = false;   
  58.                     }   
  59.                     continue;   
  60.                 }   
  61.                 //状态1,已进入body部分   
  62.                 if(status == 1)   
  63.                 {   
  64.                  //一直读到有<号位置   
  65.                     pos = s.indexOf("<", pos);   
  66.                     if(pos < 0)   
  67.                     {   
  68.                         getNewLine = true;   
  69.                         pos = 0;   
  70.                         continue;   
  71.                     }   
  72.                     //获取标志类型   
  73.                     tag = getTag(s, pos + 1);   
  74.                     if(tag != null)   
  75.                     {   
  76.                      //是否标志结束   
  77.                         if(isEndTag(tag))   
  78.                         {   
  79.                             if(mayIgnor(tag))   
  80.                             {   
  81.                              //状态2,在标签内   
  82.                                 status = 2;   
  83.                                 getNewLine = false;   
  84.                                 continue;   
  85.                             }   
  86.                             //根栈顶元素匹配   
  87.                             if(match(tag))   
  88.                             {   
  89.                                 myStack.pop();   
  90.                                 //处理完成   
  91.                                 if(myStack.empty()) break;   
  92.                                 pos++;   
  93.                                 getNewLine = false;   
  94.                                 //状态4,读取标签间内容   
  95.                                 status = 4;   
  96.                                 //继续读下一个标志   
  97.                                 start = s.indexOf(">", pos) + 1;   
  98.                                 pos = start;   
  99.                             }    
  100.                             else  
  101.                             {   
  102.                              //状态2,在标签内   
  103.                                 status = 2;   
  104.                                 getNewLine = false;   
  105.                             }   
  106.                         }    
  107.                         else if(mayIgnor(tag))   
  108.                         {   
  109.                          //状态2,在标签内   
  110.                             status = 2;   
  111.                             getNewLine = false;   
  112.                         }    
  113.                         else  
  114.                         {   
  115.                             getNewLine = false;   
  116.                             if(!isJump(tag))   
  117.                             {   
  118.                              //状态2,在标签内   
  119.                                 status = 2;   
  120.                                 //标记入栈   
  121.                                 insert(tag);   
  122.                             }    
  123.                             //状态3,结束标签   
  124.                             else status = 3;   
  125.                         }   
  126.                     }    
  127.                     else getNewLine = true;   
  128.                 }    
  129.                 //状态2,在标签内   
  130.                 else if(status == 2)   
  131.                 {   
  132.                  //一直读至结束   
  133.                     start = s.indexOf(">", pos);   
  134.                     //判断标志是否跨行   
  135.                     if(start < 0)   
  136.                     {   
  137.                         getNewLine = true;   
  138.                         pos = 0;   
  139.                     }    
  140.                     else  
  141.                     {   
  142.                         start++;   
  143.                         status = 4;   
  144.                         getNewLine = false;   
  145.                     }   
  146.                 }    
  147.                 //状态3,结束标签   
  148.                 else if(status == 3)   
  149.                 {   
  150.                     pos = s.indexOf((new StringBuilder("/")).append(tag).toString(), pos);   
  151.                     if(pos < 0)   
  152.                     {   
  153.                         getNewLine = true;   
  154.                         pos = 0;   
  155.                     }    
  156.                     else  
  157.                     {   
  158.                         pos = s.indexOf(">", pos);   
  159.                         start = ++pos;   
  160.                         status = 4;   
  161.                         getNewLine = false;   
  162.                     }   
  163.                 }    
  164.                 //状态4,获取标签之间的内容   
  165.                 else if(status == 4)   
  166.                 {   
  167.                     int end = s.indexOf("<", start);   
  168.                     if(end < 0)   
  169.                     {   
  170.                         String content = s.substring(start);   
  171.                         if(!content.trim().equalsIgnoreCase(""))   
  172.                             ((Node)myStack.getTop()).addContent(content);   
  173.                         getNewLine = true;   
  174.                         start = 0;   
  175.                     }    
  176.                     else  
  177.                     {   
  178.                         String content = s.substring(start, end);   
  179.                         content = remove(content);   
  180.                         if(!content.trim().equalsIgnoreCase(""))   
  181.                             ((Node)myStack.getTop()).addContent(content);   
  182.                         status = 1;   
  183.                         pos = end;   
  184.                         getNewLine = false;   
  185.                     }   
  186.                 }   
  187.             } while(true);   
  188.         }   
  189.         catch(IOException e)   
  190.         {   
  191.             System.out.println(e);   
  192.         }   
  193.     }   
  194.     //获取标签类型   
  195.     private String getTag(String line, int pos)   
  196.     {   
  197.         int end1 = line.indexOf(">", pos);   
  198.         int end2 = line.indexOf(" ", pos);   
  199.         if(end1 < 0 && end2 >= 0)   
  200.             return line.substring(pos, end2);   
  201.         if(end1 > 0 && end2 >= 0 && end2 < end1)   
  202.             return line.substring(pos, end2);   
  203.         if(end2 < 0 && end1 >= 0)   
  204.             return line.substring(pos, end1);   
  205.         if(end1 < 0 && end2 < 0)   
  206.             return null;   
  207.         if(end1 >= 0 && end2 >= 0 && end1 < end2)   
  208.             return line.substring(pos, end1);   
  209.         else  
  210.             return line.substring(pos);   
  211.     }   
  212.     //是否为可跳过字符   
  213.     private boolean isJump(String tag)   
  214.     {   
  215.         int size = Symbol.jump.length;   
  216.         for(int i = 0; i < size; i++)   
  217.             if(tag.equalsIgnoreCase(Symbol.jump[i]))   
  218.                 return true;   
  219.   
  220.         return false;   
  221.     }   
  222.     //是否结束标签   
  223.     private boolean isEndTag(String tag)   
  224.     {   
  225.         int pos = tag.indexOf("/");   
  226.         return pos >= 0;   
  227.     }   
  228.     //是否跟栈顶标签匹配   
  229.     private boolean match(String tag)   
  230.     {   
  231.         Node node = (Node)myStack.getTop();   
  232.         String str = node.tag;   
  233.         int pos = tag.indexOf(str);   
  234.         return pos >= 0;   
  235.     }   
  236.     //是否为可忽略字符   
  237.     private boolean mayIgnor(String tag)   
  238.     {   
  239.         int i = 0;   
  240.         for(int size = Symbol.ignore.length; i < size; i++)   
  241.         {   
  242.             boolean res = tag.equalsIgnoreCase(Symbol.ignore[i]);   
  243.             if(res) return true;   
  244.             int r = tag.indexOf("!");   
  245.             if(r >= 0return true;   
  246.         }   
  247.   
  248.         return false;   
  249.     }   
  250.     //删除特殊字符   
  251.     public String remove(String str)   
  252.     {   
  253.         int len = Symbol.remove.length;   
  254.         for(int i = 0; i < len; i++)   
  255.         {   
  256.             String s = Symbol.remove[i];   
  257.             str = str.replaceAll(s, "");   
  258.         }   
  259.         return str;   
  260.     }   
  261.     //将树上节点插入栈中   
  262.     private void insert(String tag)   
  263.     {   
  264.         Node node;   
  265.         if(myStack.empty()) node = new Node("", tag, null);   
  266.         else node = new Node("", tag, (Node)myStack.getTop());   
  267.         myStack.push(node);   
  268.         tree.insert(node);   
  269.     }   
  270.     //返回整棵树   
  271.     public HTree getTree()   
  272.     {   
  273.         return tree;   
  274.     }   
  275.   
  276.     private Stack myStack;   
  277.     private HTree tree;   
  278. }   
  279.   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics