用htmlparser解析,怎么拿不到子标签的理想对象?

最近写一个小爬虫, 用的htmlparser来解析HTML, 不过, 在解析Object标签时有些不方便,不能准确地拿到子标签对应的理想对象。 

 

下面这样的一段HTML, 

 

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
		codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"
		height="406" width="980">
		<param name="quality" value="high" />
		<param name="movie" value="/flash/index.swf" />
		<param name="quality" value="high" />
		<param name="wmode" value="transparent" />
		<param name="movie" value="/flash/index.swf" />
		<embed height="406" pluginspage="http://www.macromedia.com/go/getflashplayer"
			quality="high" src="/flashRepository/d973f054-ae5d-453d-bbfb-9b9c825fd7df"
			type="application/x-shockwave-flash" width="980" wmode="transparent"></embed>
</object>
 

 

我用HtmlParser解析后, 可以成功地拿到Object标签对应的对象, 可再往下就拿不到了, Param和Embed标签都是TagNode类型的, 而不是我想要的ParamTag和EmbedTag,这两个类的实现在下面, 是我自己定义的。

 

 

解析的代码是这样的:

 

 

 

PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
        factory.registerTag(new LocalObjectTag());
        factory.registerTag(new EmbedTag());
        factory.registerTag(new ParamTag());
        
        Parser parser = new Parser();
    	parser.setNodeFactory(factory);
    	try {
			parser.setInputHTML(testHTML);
		} catch (ParserException e) {
			e.printStackTrace();
		}
		parser.setFeedback(new DefaultParserFeedback(DefaultParserFeedback.QUIET));
		
		NodeFilter[] srcFilters = { new NodeClassFilter(EmbedTag.class), 
				new NodeClassFilter(LocalObjectTag.class),new NodeClassFilter(ParamTag.class) };
		
		

		OrFilter linkFilter = new OrFilter(srcFilters);
		// 得到所有经过过滤的标签
		try {
			NodeList list = parser.extractAllNodesThatMatch(linkFilter);
			
			for (int i = 0; i < list.size(); i++) {
				Node n = list.elementAt(i);
				if (n instanceof ParamTag) {
					ParamTag p = (ParamTag) n;
					System.out.println("src: " + p.getSrc());
				}
			}
			
		} catch (ParserException e) {
			e.printStackTrace();
		}
		
		System.out.println("exit");
 

 

由于Parser里没有自带的EmbedTag和ParamTag, 我自写了这两个类。 

 

public class ParamTag extends CompositeTag {
	
	public String getSrc() {
		String result = null;

		
		//先看data属性里有没有值。
		String srcValue = getAttribute("SRC");
		if (StringUtils.isNotBlank(srcValue)) {
			return getPage ().getAbsoluteURL (srcValue);
		}
		
		return result;
	}
	
	public boolean isMovie() {
		return null != getAttribute("MOVIE");
	}
}


public class EmbedTag extends CompositeTag {
	
	public String getSrc() {
		String result = null;

		//先看data属性里有没有值。
		String srcValue = getAttribute("SRC");
		if (StringUtils.isNotBlank(srcValue)) {
			return getPage ().getAbsoluteURL (srcValue);
		}
		
		return result;
	}
}
 

 另, 为了方便地使用ObjectTag, 我又继承了下, 搞了个新类LocalObjectTag。



public class LocalObjectTag extends ObjectTag {
	
	public String extractUrl() {
		String result = null; 

		//先看data属性里有没有值。
		String dataValue = getAttribute("data");
		if (StringUtils.isNotBlank(dataValue)) {
			return getPage ().getAbsoluteURL (dataValue);
		}
		
		result = fromChildren();
		if (StringUtils.isNotBlank(result)) {
			return result;
		}
		
		return result;
	}

	
	private String fromChildren() {
		String result = null;
		NodeList nList = this.getChildren();
		for(int i=0;i<nList.size();i++) {
			Node n = nList.elementAt(i);
			
			if (n instanceof TagNode) {
				TagNode tNode = (TagNode)n;
				String value = tNode.getAttribute("VALUE");
				String nameAttri = tNode.getAttribute("name");
				
				if (StringUtils.isNotBlank(value) && "movie".equalsIgnoreCase(nameAttri)) {
					return value;
				}
				
				String src = tNode.getAttribute("src");
				String name = tNode.getTagName();
				if (StringUtils.isNotBlank(src) && "embed".equalsIgnoreCase(name)) {
					return src;
				}
			}
		}
		
		return result;
	}

}
 


在解析前, 我用这样的设置
	PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
        factory.registerTag(new LocalObjectTag());
        factory.registerTag(new EmbedTag());
        factory.registerTag(new ParamTag());
 

光这样还不够? 请问还需要有什么特殊设置么?


 

资源下载链接为: https://pan.quark.cn/s/3d8e22c21839 随着 Web UI 框架(如 EasyUI、JqueryUI、Ext、DWZ 等)的不断发展与成熟,系统界面的统一化设计逐渐成为可能,同时代码生成器也能够生成符合统一规范的界面。在这种背景下,“代码生成 + 手工合并”的半智能开发模式正逐渐成为新的开发趋势。通过代码生成器,单表数据模型以及一对多数据模型的增删改查功能可以被直接生成并投入使用,这能够有效节省大约 80% 的开发工作量,从而显著提升开发效率。 JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台。它引领了一种全新的开发模式,即从在线编码(Online Coding)到代码生成器生成代码,再到手工合并(Merge)的智能开发流程。该平台能够帮助开发者解决 Java 项目中大约 90% 的重复性工作,让开发者可以将更多的精力集中在业务逻辑的实现上。它不仅能够快速提高开发效率,帮助公司节省大量的人力成本,同时也保持了开发的灵活性。 JEECG 的核心宗旨是:对于简单的功能,可以通过在线编码配置来实现;对于复杂的功能,则利用代码生成器生成代码后,再进行手工合并;对于复杂的流程业务,采用表单自定义的方式进行处理,而业务流程则通过工作流来实现,并且可以扩展出任务接口,供开发者编写具体的业务逻辑。通过这种方式,JEECG 实现了流程任务节点和任务接口的灵活配置,既保证了开发的高效性,又兼顾了项目的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值