- 浏览: 28591 次
- 性别:
- 来自: 广州
最新评论
-
Java小菜哈:
大哥,你有没有试过的,解析DOM数的时候还是个死循环。
java解析xml之一:使用SAX与DOM -
Sequencenet:
可以使用,开源精神发扬光大。
java获取网页主信息之五:测试 -
lahvey:
可以写一个浏览器了,利害
java获取网页主信息之一:html树操作 -
xo_tobacoo:
很想看看,可是干扰的字符太多,请清理下哦!
位操作技巧 -
sku:
好东东,谢谢博主无私奉献,真的太厉害。我一定要好好研究一下。
...
java获取网页主信息之五:测试
对html文件进行扫描,将html元素抽象出来形成树。
- package Source;
- import java.io.*;
- public class HTML2Tree
- {
- //构造方法
- public HTML2Tree()
- {
- tree = new HTree();
- myStack = new Stack();
- }
- //主要处理方法,将一个html文件转换成一个树
- public void main(String filename)
- {
- //html文件
- File f = new File(filename);
- String s = "";
- //标志类型
- String tag = "";
- //读取的当前位置
- int pos = 0;
- //开始位置
- int start = 0;
- int num = 0;
- int status = 0;
- boolean getNewLine = true;
- //html为根节点
- insert("html");
- try
- {
- BufferedReader fis = new BufferedReader(new FileReader(f));
- do
- {
- //获取新的一行并初始化要处理的字符串
- if(getNewLine)
- {
- s = fis.readLine();
- if(s == null) break;
- num++;
- if(s.equalsIgnoreCase("")) continue;
- s = s.toLowerCase();
- pos = 0;
- }
- //状态0,还在html层,并一直读至body块为止
- if(status == 0)
- {
- pos = s.indexOf(");
- if(pos < 0) getNewLine = true;
- else
- {
- //body入栈
- insert("body");
- status = 1;
- pos++;
- getNewLine = false;
- }
- continue;
- }
- //状态1,已进入body部分
- if(status == 1)
- {
- //一直读到有<号位置
- pos = s.indexOf("<", pos);
- if(pos < 0)
- {
- getNewLine = true;
- pos = 0;
- continue;
- }
- //获取标志类型
- tag = getTag(s, pos + 1);
- if(tag != null)
- {
- //是否标志结束
- if(isEndTag(tag))
- {
- if(mayIgnor(tag))
- {
- //状态2,在标签内
- status = 2;
- getNewLine = false;
- continue;
- }
- //根栈顶元素匹配
- if(match(tag))
- {
- myStack.pop();
- //处理完成
- if(myStack.empty()) break;
- pos++;
- getNewLine = false;
- //状态4,读取标签间内容
- status = 4;
- //继续读下一个标志
- start = s.indexOf(">", pos) + 1;
- pos = start;
- }
- else
- {
- //状态2,在标签内
- status = 2;
- getNewLine = false;
- }
- }
- else if(mayIgnor(tag))
- {
- //状态2,在标签内
- status = 2;
- getNewLine = false;
- }
- else
- {
- getNewLine = false;
- if(!isJump(tag))
- {
- //状态2,在标签内
- status = 2;
- //标记入栈
- insert(tag);
- }
- //状态3,结束标签
- else status = 3;
- }
- }
- else getNewLine = true;
- }
- //状态2,在标签内
- else if(status == 2)
- {
- //一直读至结束
- start = s.indexOf(">", pos);
- //判断标志是否跨行
- if(start < 0)
- {
- getNewLine = true;
- pos = 0;
- }
- else
- {
- start++;
- status = 4;
- getNewLine = false;
- }
- }
- //状态3,结束标签
- else if(status == 3)
- {
- pos = s.indexOf((new StringBuilder("/")).append(tag).toString(), pos);
- if(pos < 0)
- {
- getNewLine = true;
- pos = 0;
- }
- else
- {
- pos = s.indexOf(">", pos);
- start = ++pos;
- status = 4;
- getNewLine = false;
- }
- }
- //状态4,获取标签之间的内容
- else if(status == 4)
- {
- int end = s.indexOf("<", start);
- if(end < 0)
- {
- String content = s.substring(start);
- if(!content.trim().equalsIgnoreCase(""))
- ((Node)myStack.getTop()).addContent(content);
- getNewLine = true;
- start = 0;
- }
- else
- {
- String content = s.substring(start, end);
- content = remove(content);
- if(!content.trim().equalsIgnoreCase(""))
- ((Node)myStack.getTop()).addContent(content);
- status = 1;
- pos = end;
- getNewLine = false;
- }
- }
- } while(true);
- }
- catch(IOException e)
- {
- System.out.println(e);
- }
- }
- //获取标签类型
- private String getTag(String line, int pos)
- {
- int end1 = line.indexOf(">", pos);
- int end2 = line.indexOf(" ", pos);
- if(end1 < 0 && end2 >= 0)
- return line.substring(pos, end2);
- if(end1 > 0 && end2 >= 0 && end2 < end1)
- return line.substring(pos, end2);
- if(end2 < 0 && end1 >= 0)
- return line.substring(pos, end1);
- if(end1 < 0 && end2 < 0)
- return null;
- if(end1 >= 0 && end2 >= 0 && end1 < end2)
- return line.substring(pos, end1);
- else
- return line.substring(pos);
- }
- //是否为可跳过字符
- private boolean isJump(String tag)
- {
- int size = Symbol.jump.length;
- for(int i = 0; i < size; i++)
- if(tag.equalsIgnoreCase(Symbol.jump[i]))
- return true;
- return false;
- }
- //是否结束标签
- private boolean isEndTag(String tag)
- {
- int pos = tag.indexOf("/");
- return pos >= 0;
- }
- //是否跟栈顶标签匹配
- private boolean match(String tag)
- {
- Node node = (Node)myStack.getTop();
- String str = node.tag;
- int pos = tag.indexOf(str);
- return pos >= 0;
- }
- //是否为可忽略字符
- private boolean mayIgnor(String tag)
- {
- int i = 0;
- for(int size = Symbol.ignore.length; i < size; i++)
- {
- boolean res = tag.equalsIgnoreCase(Symbol.ignore[i]);
- if(res) return true;
- int r = tag.indexOf("!");
- if(r >= 0) return true;
- }
- return false;
- }
- //删除特殊字符
- public String remove(String str)
- {
- int len = Symbol.remove.length;
- for(int i = 0; i < len; i++)
- {
- String s = Symbol.remove[i];
- str = str.replaceAll(s, "");
- }
- return str;
- }
- //将树上节点插入栈中
- private void insert(String tag)
- {
- Node node;
- if(myStack.empty()) node = new Node("", tag, null);
- else node = new Node("", tag, (Node)myStack.getTop());
- myStack.push(node);
- tree.insert(node);
- }
- //返回整棵树
- public HTree getTree()
- {
- return tree;
- }
- private Stack myStack;
- private HTree tree;
- }
发表评论
-
java获取网页主信息之五:测试
2007-09-01 22:29 24231.所需文件 param.txt:存放需要提取信息的网页路径 ... -
java获取网页主信息之四:抽取信息块
2007-09-01 22:24 2269从已经建立完成的html树中抽取主信息。 pac ... -
java获取网页主信息之二:辅助操作
2007-09-01 22:19 17451.栈操作 package Source; ... -
java获取网页主信息之一:html树操作
2007-09-01 22:17 29881.节点操作 package ... -
java解析xml之三:使用domj4
2007-09-01 22:06 4269一.简介 DOM4J是dom4j.org出品的一个开源 ... -
java解析xml之二:使用JDOM
2007-09-01 21:49 1616一.简介 JDOM是一种解析XML的Java工具包。 ... -
java解析xml之一:使用SAX与DOM
2007-09-01 17:29 3727一.概要 用Java解析XML文档,最常用的有两种方法:使 ...
相关推荐
JSON数据在这种情况下扮演了数据源的角色,可以包含层级关系和节点信息,如`text`(显示文本)、`children`(子节点数组)等。 例如,一个简单的JSON格式的树数据可能如下所示: ```json [ { "text": "父节点1",...
### Tree组件在EasyUI中的应用及Java代码集成详解 #### 一、Tree组件概述 在Web应用程序开发过程中,为了展示层级结构的数据,如文件系统、组织架构等,开发者经常需要使用到树形(Tree)控件。EasyUI框架提供了一...
这个"extjs-tree.zip"文件包含了使用Java编写的ExtJS异步树形控件的示例代码,旨在帮助开发者快速理解和应用这一功能。ExtJS是Sencha公司开发的一个前端框架,广泛应用于构建富互联网应用程序(RIA)。 在ExtJS中,...
console.error('Failed to fetch tree data:', error); } }); ``` 总结来说,这个项目涵盖了以下知识点: 1. Java实体类设计 2. MySQL数据库操作 3. 递归查询 4. JDBC/ORM框架使用 5. 数据结构与算法(构建树形...
在压缩包文件"treedemo"中,可能包含了实现上述功能的源代码文件,如HTML、CSS、JavaScript以及可能的Java后端接口。解压并研究这些文件,可以帮助我们更好地理解和学习如何在ExtJS中开发树效果。通过阅读和学习这个...
1. **数据获取**:首先,你需要获取一个`hprof`文件,这是Java虚拟机(JVM)生成的内存快照,通常在`OutOfMemoryError`发生时生成。你可以通过JVM参数`-XX:+HeapDumpOnOutOfMemoryError`配置自动导出,或者在程序...
JavacTo是一个原型工具,旨在评估将Java代码转换为另一种编程语言的需求和价值。 理想的翻译语言是支持包... 可以在以下位置获得Vistor javadocs:http://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/index.html
tree.loadXML("/path/to/your/servlet/TreeDataServlet"); // 调用Java Servlet获取XML数据 ``` - 如果需要自定义行为,例如点击事件,可以注册事件处理器。 3. **XML数据结构**: - dhtmlXTree期望的XML结构...
在这种情况下,Java POI库是一个非常有用的工具,它允许开发者在Java环境中操作Microsoft Office的文件格式,包括Excel的.xls和.xlsx文件。本文将详细介绍如何在Android中使用POI库来解析Excel文件,并将其转换为...
- **三个经常使用的取值函数**:获取树节点的信息,如`getRoot()`获取根节点。 - **根据node得到path**:使用`getPath()`等方法来获取节点路径。 - **根据Path展开到该节点**:通过`expandPath()`方法展开到指定路径...
document.getElementById('ttt').value = tree.getSelected().toHtml(); } ``` - **查找节点**:根据文本内容搜索子节点。 ```javascript function findnode() { tree.findChildByText(document....
out.println(new Gson().toJson(treeNodes)); %> ``` 4. **生成树形结构**: 在`generateTree`函数中,我们需要解析接收到的JSON数据,并构建树形结构。可以使用现成的JavaScript库,如jQuery UI的`treeview`...
本篇将深入讲解如何利用JavaServer Pages (JSP) 技术,结合DTREE库动态从数据库中获取数据并生成树形结构。DTREE库提供了方便的API,使得开发者可以轻松地在网页上展示复杂的数据结构。 首先,我们需要了解JSP的...
- 示例:`<s:checkbox name="acceptTerms" label="I agree to the terms and conditions" />` - 用途:收集用户的选择数据。 - **`<s:radio>`**:生成单选按钮。 - 示例:`<s:radio list="{'male': 'Male', '...
url: 'tree_data.json', // 从服务器获取数据的URL reader: { type: 'json', rootProperty: 'nodes' // JSON数据中的根节点属性名 } } }); ``` 为了实现动态功能,我们需要扩展EXT的树节点行为。这包括编辑...
#### 三、网络爬虫实现 **知识点概述:** 此题考察了网络爬虫的基本原理、HTTP请求发送以及数据库操作等方面的知识。 **详细解析:** 1. **爬虫基本框架**: - 使用Java语言编写爬虫通常会涉及到网络请求库(如...
在IT领域,`treeview`是一种常见的用户界面元素,特别是在网页和桌面应用程序中,它用于以树形结构展示数据,使得用户能够逐级展开、浏览和选择文件夹、目录或者项目。这种控件对于有层次关系的数据组织非常有用,...
前端页面使用的jsp(Java服务端网页(一种建立动态网页的技术,Java Server Page)) JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多...
Struts是一个基于Java Servlet/JavaServer Pages(JSP)技术的开源MVC框架,用于构建企业级的Web应用。Struts将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,这种分离有助于提高代码的...