`
hujin1979
  • 浏览: 80149 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

打造一个全能的解析器好像是比较困难的事情

阅读更多

  我们尝试用org.cyberneko.html.parsers.DOMParser来全面细致的分析互联网上的网站,但事实上由于各种技术流派的盛行导致了千变万化的网站技术,也导致了我们想细致分析每个页面成了一种理想状态的事情。
  但是,我们在能里和了解范围内还是希望把工作做得更周到,页面解析的类我写在一个叫ParseDocument.java的文件中,目前它能做到事情就是把取得的HTML代码进行分析,获取我们希望获得的数据并保存在对象中以供使用。我们还是先看看代码。 

import java.io.StringReader; 
import java.lang.reflect.Constructor; 
import java.util.ArrayList; 
import java.util.HashMap; 

import org.cyberneko.html.parsers.DOMParser; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

import com.ue.browser.Browser; 
import com.ue.browser.core.ElementCode; 
import com.ue.browser.core.HTMLElement; 
import com.ue.browser.Frame; 
import com.ue.browser.Iframe; 

public class ParseDocument { 
private ArrayList<HTMLElement> elements = new ArrayList<HTMLElement>(); 
private Browser browser; 
private HTMLElement element; 
private String text; 
private InputSource source; 
private static DOMParser parser = new DOMParser(); 

public boolean haveIframe = false; 
public boolean haveFrame = false; 

public ParseDocument(Browser browser) { 
super(); 
this.browser = browser; 
} 

public ArrayList<HTMLElement> getElements() { 
return elements; 
} 

public void setElements(ArrayList<HTMLElement> elements) { 
this.elements = elements; 
} 

public Browser getBrowser() { 
return browser; 
} 

public void setBrowser(Browser browser) { 
this.browser = browser; 
} 

public HTMLElement getElement() { 
return element; 
} 

public void setElement(HTMLElement element) { 
this.element = element; 
} 


   
private static HashMap<String, String> elementMap = ElementCode.getElements(); 
private static String thePack = "com.ue.browser.html."; 

public void parse(String body){ 
try{ 
source = new InputSource(new StringReader(body)); 
//是否允许命名空间 
parser.setFeature("http://xml.org/sax/features/namespaces", false); 
//是否允许增补缺失的标签。如果要以XML方式操作HTML文件,此值必须为真 
parser.setFeature("http://cyberneko.org/html/features/balance-tags", true); 
//是否剥掉<script>元素中的<!-- -->等注释符 
parser.setFeature("http://cyberneko.org/html/features/scanner/script/strip-comment-delims", true); 
parser.setFeature("http://cyberneko.org/html/features/augmentations", true); 
parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower"); 

//解析HTML片段时是否作标签增补,此功能不要用在DOMParser上,而要用在DOMFragmentParser上 
//parser.setFeature("http://cyberneko.org/features/document-fragment",true); 
//添加管道过滤器 
/*XMLDocumentFilter noop = new DefaultFilter(); 
XMLDocumentFilter[] filters = { noop }; 
parser.setProperty("http://cyberneko.org/html/properties/filters", filters);*/ 

parser.parse(source); 

//cyberneko解析:将httpclien读取的数据source解析成w3c的Document对象 
this.buildElements(parser.getDocument()); 
}catch(Exception e){ 
e.printStackTrace(); 
} 
} 

    //从w3c的Document节点对象中获取节点的属性放入对应的类中 
public void buildElements(Node node){ 
int type = node.getNodeType(); 
switch (type) { 
// print the document element 
case Node.DOCUMENT_NODE: { 
this.buildElements(((org.w3c.dom.Document) node).getDocumentElement()); 
break; 
} 

// print element with attributes 
case Node.ELEMENT_NODE: { 
String name = node.getNodeName(); 
String clazz = elementMap.get(name); 
try{ 
if(clazz!=null){ 
Class<?> tt = Class.forName(thePack+clazz); 
            Constructor<?> c = tt.getConstructor(Browser.class); 
            element = (HTMLElement)c.newInstance(this.getBrowser()); 
            NamedNodeMap attrs = node.getAttributes(); 
for (int i = 0; i < attrs.getLength(); i++) { 
Node attr = attrs.item(i); 
element.setAttribute(attr.getNodeName(), attr.getNodeValue()); 
} 
                elements.add(element); 
} 
}catch(Exception e){ 
e.printStackTrace(); 
} 

//查询子节点表,并构建子节点属性 
NodeList children = node.getChildNodes(); 
if (children != null) { 
int len = children.getLength(); 
for (int i = 0; i < len; i++) 
this.buildElements(children.item(i)); 
} 
break; 
} 

// handle entity reference nodes 
case Node.ENTITY_REFERENCE_NODE: { 
break; 
} 

// print cdata sections 
case Node.CDATA_SECTION_NODE: { 
break; 
} 

// print text 
case Node.TEXT_NODE: { 
text = node.getNodeValue(); 
break; 
} 

/*//print script 注释节点<!--   -->   
case Node.COMMENT_NODE: { 
script = node.getNodeValue(); 
System.out.println(script); 
break; 
}*/ 

// print processing instruction 
case Node.PROCESSING_INSTRUCTION_NODE: { 
break; 
} 
} 

    if (type == Node.ELEMENT_NODE) { 
   if(node.getNodeName().equals("TEXTAREA")){ 
element.setAttribute("value", text); 
} 

if (type == Node.ELEMENT_NODE) { 
if(node.getNodeName().equals("IFRAME")){ 
//如果有IFRAME节点,进行IFRAME处理 
haveIframe = true; 
} 
} 

if (type == Node.ELEMENT_NODE) { 
if(node.getNodeName().equals("FRAME")){ 
                  //如果有FRAME节点,进行FRAME处理 
haveFrame = true; 
} 
} 

    if(node.getNodeName().equals("SCRIPT")){ 
if(text!=null){ 
element.setAttribute("daima", text); 
} 
} 
} 
} 

//获得当前节点的父节点名称 
public String getParentNodeName(Node node){ 
Node parent = node.getParentNode(); 
String name = parent.getNodeName(); 
return name; 
} 

public boolean isHaveFrame() { 
return haveFrame; 
} 

public void setHaveFrame(boolean haveFrame) { 
this.haveFrame = haveFrame; 
} 

public boolean isHaveIframe() { 
return haveIframe; 
} 

public void setHaveIframe(boolean haveIframe) { 
this.haveIframe = haveIframe; 
  } 
}  

 
  重要的部分我都有中文注释,其实我觉得我还只能用中文注释会比较准确,英文对我来说,可能还不能把我想表达的意思正确告诉中国程序员。
  Class<?> tt = Class.forName(thePack+clazz);
  Constructor<?> c = tt.getConstructor(Browser.class);
  element = (HTMLElement)c.newInstance(this.getBrowser());
  可能这里对刚开始用java写程序的人来说要费劲理解一下,大家可以好好了解java的型别控制机制,然后对照实际的代码进行思考,这种设计模式其实在java应用中到处都在使用。

 

分享到:
评论
1 楼 记忆无泪 2009-12-26  
com.ue.browser.Browser;

这个是你自己写的还是网上有jar包了 我找不到 我是一个Java初学者 烦指教

相关推荐

    全能解析3.8.zip

    【标题】"全能解析3.8.zip"是一个包含软件或应用程序源代码的压缩文件,它可能是一个用于视频流媒体服务的平台。"全能解析"这个名字暗示了该软件可能具有广泛的功能,能够处理多种类型的视频资源,提供一站式的解码...

    威克斯全能网盘解析程序V1.1.0免费绿色版

    威克斯全能网盘解析程序是一个由威克斯技术圈制作的一款网盘地址解析工具。有些网盘文件下载起来比较麻烦,就如百度的,一下太大的文件就需要百度云来下载必能直接调用迅雷下载,这怎么办了?全能网盘解析程序就能...

    全能电子书阅读器

    总的来说,全能电子书阅读器通过其强大的格式兼容性和丰富的功能,为用户提供了一个一站式阅读解决方案。无论是学术研究、休闲阅读还是专业学习,都能在这个平台上找到适合自己的阅读方式,尽情享受电子书带来的便捷...

    全能电子地图下载器3.0

    全能电子地图下载器3.0是一款专为地理信息爱好者和专业人士设计的强大工具,它能够帮助用户轻松地下载卫星影像和导出行政边界数据。这款软件的功能丰富,适用于各种用途,如地图制图、地理分析、规划研究、环境监测...

    全能电子地图下载器

    瓦片图是一种常见的地图展示方式,它将地球表面分成一系列等大小的正方形图像,每个图像被称为一个瓦片。这种分块方式使得地图的加载更为快速,因为用户只需要加载他们当前查看区域的瓦片,而不是整个地图。同时,...

    全能地图下载器

    1. **多平台支持**:全能地图下载器的一个显著特点是其对多种地图源的兼容性。用户可以根据需求选择谷歌地图、高德地图等,这些地图服务通常提供了不同层次的分辨率和丰富的信息,满足不同领域的应用需求。 2. **...

    全能云解析V3.8源码稳定版

    全能云解析3.8 【3.7正式版 可以直接覆盖升级,其他版本 请重新安装!】 安装须知: 主目录文件结构及说明:(备注:调用方式前面皆省略了解析域名,浏览器访问时请添加在前面) 文件: * index....

    枫叶全能视频转换器

    枫叶全能视频转换器

    PDB PDF PDG TLPDB txt 格式 全能 阅读器

    通过集成多种格式的支持,用户无需担心电子书的格式问题,只需一个软件即可满足所有阅读需求。此外,通常这样的阅读器还会提供诸如书签、高亮、搜索、字体调整等实用功能,提升阅读体验。在实际使用中,用户可以轻松...

    HiJson小工具全能解析json

    标题“HiJson小工具全能解析json”所指的是一个名为HiJson的软件工具,专为JSON(JavaScript Object Notation)数据格式的解析而设计。JSON是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和...

    全能电子地图下载器,全能电子地图下载器

    1. **安装.docx**:这是一个文档文件,通常用于提供软件的安装指南或使用说明,用户可以通过阅读这份文档了解如何正确安装和配置全能电子地图下载器。 2. **MapTileDownloader_Ultimate_1.9.5.exe**:这很可能是全能...

    全能电子地图下载器3.0.zip

    全能电子地图下载器3.0是一款专为地图爱好者和专业人士设计的强大工具,它允许用户方便地从互联网上下载各种电子地图数据,以便离线使用或进行深入的地图分析和处理。这款软件支持多种地图源,包括但不限于谷歌地图...

    电子地图 全能下载器 V3

    此外,软件的安装文件setup_3.7.10.15_.exe表明这是一个版本号为3.7.10.15的安装程序,这通常意味着软件经过了多次迭代和优化,具有较高的稳定性和兼容性。而软件介绍_.txt文件可能是关于软件功能、操作指南或者更新...

    超酷全能PDF阅读器 3.0.0.128 官方版

    在PDF阅读器领域,超酷全能PDF阅读器独树一帜,它的最大亮点在于其“只有一个文件”的设计。这意味着用户下载后无需进行复杂的安装过程,只需双击即可启动,极大地简化了使用步骤。同时,由于它不包含任何额外的插件...

    一个全能的网页特效

    本文将深入探讨“一个全能的网页特效”,包括js图片文字滚动特效、文字的左右上下无缝滚动以及图片的相同效果,同时还会讲解如何调节滚动速度和方向,以及图片的大小调整。 一、JS图片文字滚动特效 JavaScript...

    狸窝全能视频转换器

    这些功能使得狸窝全能视频转换器不仅仅是一个转换工具,更是一个小型的视频处理工作站。 总结来说,狸窝全能视频转换器是一款功能全面、易用的多媒体软件,其绿色版设计确保了使用过程的纯净和便捷。无论你是想要将...

    免费全能上网流量和时间统计软件-全能上网计费器

    全能上网计费器是一款专为用户设计的免费流量和时间管理工具,旨在帮助用户精确地追踪和控制他们的网络使用情况。这款软件具有轻量级的特点,不会占用过多系统资源,同时提供直观且易于操作的设置界面,使得无论是...

    全能键盘测试器

    "全能键盘测试器"的核心功能在于提供一个简洁明了的界面,用户可以逐个或一次性测试所有键位,包括字母、数字、符号以及功能键。它能实时显示每个按键的按下和释放状态,帮助用户识别是否存在按键卡顿、错位或者未...

    全能地图下载器-jb51

    总之,全能地图下载器是一个强大的地图获取工具,它集多种地图类型、高精度的地理信息和灵活的保存格式于一身,为用户提供了一个全面的地图数据解决方案。无论是专业工作还是个人兴趣,它都能满足用户对地图数据的...

Global site tag (gtag.js) - Google Analytics