`
sysu_zeh
  • 浏览: 28591 次
  • 性别: 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.   
分享到:
评论

相关推荐

    Extjs的Tree和Tab使用json做tree数据交互

    JSON数据在这种情况下扮演了数据源的角色,可以包含层级关系和节点信息,如`text`(显示文本)、`children`(子节点数组)等。 例如,一个简单的JSON格式的树数据可能如下所示: ```json [ { "text": "父节点1",...

    tree的使用

    ### Tree组件在EasyUI中的应用及Java代码集成详解 #### 一、Tree组件概述 在Web应用程序开发过程中,为了展示层级结构的数据,如文件系统、组织架构等,开发者经常需要使用到树形(Tree)控件。EasyUI框架提供了一...

    extjs-tree.zip_extjs tree

    这个"extjs-tree.zip"文件包含了使用Java编写的ExtJS异步树形控件的示例代码,旨在帮助开发者快速理解和应用这一功能。ExtJS是Sencha公司开发的一个前端框架,广泛应用于构建富互联网应用程序(RIA)。 在ExtJS中,...

    java实现无限级分类树形,连接mysql数据库

    console.error('Failed to fetch tree data:', error); } }); ``` 总结来说,这个项目涵盖了以下知识点: 1. Java实体类设计 2. MySQL数据库操作 3. 递归查询 4. JDBC/ORM框架使用 5. 数据结构与算法(构建树形...

    extjs开发tree效果

    在压缩包文件"treedemo"中,可能包含了实现上述功能的源代码文件,如HTML、CSS、JavaScript以及可能的Java后端接口。解压并研究这些文件,可以帮助我们更好地理解和学习如何在ExtJS中开发树效果。通过阅读和学习这个...

    MAT解析hprof内存溢出分析工具OutOfMemoryError-java程序开发

    1. **数据获取**:首先,你需要获取一个`hprof`文件,这是Java虚拟机(JVM)生成的内存快照,通常在`OutOfMemoryError`发生时生成。你可以通过JVM参数`-XX:+HeapDumpOnOutOfMemoryError`配置自动导出,或者在程序...

    JavacTo:将Java源代码翻译成另一种语言-开源

    JavacTo是一个原型工具,旨在评估将Java代码转换为另一种编程语言的需求和价值。 理想的翻译语言是支持包... 可以在以下位置获得Vistor javadocs:http://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/index.html

    java中调用dhtmlXTree与xml (2)设置地址url

    tree.loadXML("/path/to/your/servlet/TreeDataServlet"); // 调用Java Servlet获取XML数据 ``` - 如果需要自定义行为,例如点击事件,可以注册事件处理器。 3. **XML数据结构**: - dhtmlXTree期望的XML结构...

    Android通过POI完美解析Excel.xls xlsx成html编译前jar包

    在这种情况下,Java POI库是一个非常有用的工具,它允许开发者在Java环境中操作Microsoft Office的文件格式,包括Excel的.xls和.xlsx文件。本文将详细介绍如何在Android中使用POI库来解析Excel文件,并将其转换为...

    swing界面设计之JTree

    - **三个经常使用的取值函数**:获取树节点的信息,如`getRoot()`获取根节点。 - **根据node得到path**:使用`getPath()`等方法来获取节点路径。 - **根据Path展开到该节点**:通过`expandPath()`方法展开到指定路径...

    ajax实现目录树

    document.getElementById('ttt').value = tree.getSelected().toHtml(); } ``` - **查找节点**:根据文本内容搜索子节点。 ```javascript function findnode() { tree.findChildByText(document....

    ajax动态生成树 用于jsp

    out.println(new Gson().toJson(treeNodes)); %&gt; ``` 4. **生成树形结构**: 在`generateTree`函数中,我们需要解析接收到的JSON数据,并构建树形结构。可以使用现成的JavaScript库,如jQuery UI的`treeview`...

    JSP动态生成树DTREE

    本篇将深入讲解如何利用JavaServer Pages (JSP) 技术,结合DTREE库动态从数据库中获取数据并生成树形结构。DTREE库提供了方便的API,使得开发者可以轻松地在网页上展示复杂的数据结构。 首先,我们需要了解JSP的...

    struts2标签的使用

    - 示例:`&lt;s:checkbox name="acceptTerms" label="I agree to the terms and conditions" /&gt;` - 用途:收集用户的选择数据。 - **`&lt;s:radio&gt;`**:生成单选按钮。 - 示例:`&lt;s:radio list="{'male': 'Male', '...

    EXT实现动态树的功能

    url: 'tree_data.json', // 从服务器获取数据的URL reader: { type: 'json', rootProperty: 'nodes' // JSON数据中的根节点属性名 } } }); ``` 为了实现动态功能,我们需要扩展EXT的树节点行为。这包括编辑...

    松迪培训入学测试题

    #### 三、网络爬虫实现 **知识点概述:** 此题考察了网络爬虫的基本原理、HTTP请求发送以及数据库操作等方面的知识。 **详细解析:** 1. **爬虫基本框架**: - 使用Java语言编写爬虫通常会涉及到网络请求库(如...

    treeview树状文件选择结构

    在IT领域,`treeview`是一种常见的用户界面元素,特别是在网页和桌面应用程序中,它用于以树形结构展示数据,使得用户能够逐级展开、浏览和选择文件夹、目录或者项目。这种控件对于有层次关系的数据组织非常有用,...

    GoodProject Maven Webapp.zip

    前端页面使用的jsp(Java服务端网页(一种建立动态网页的技术,Java Server Page)) JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多...

    在struts里的实现dtree通用树型结构

    Struts是一个基于Java Servlet/JavaServer Pages(JSP)技术的开源MVC框架,用于构建企业级的Web应用。Struts将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,这种分离有助于提高代码的...

Global site tag (gtag.js) - Google Analytics