`

用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());
 

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


 

0
2
分享到:
评论

相关推荐

    java解析html工具htmlparser的jar包及api文档

    例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`&lt;a&gt;`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....

    htmlparser解析API

    在使用HTMLParser时,首先需要创建一个`Parser`对象。可以通过传递一个`URLConnection`对象来构造`Parser`,这样可以从网络获取HTML内容。例如: ```java URL url = new URL("http://example.com"); URLConnection ...

    htmlparser解析Html的jar包和源文件包(两个)

    - **事件驱动的解析模型**:通过监听器模式,用户可以注册事件处理器,当解析到特定标签、文本或其他元素时触发回调。 - **DOM树构建**:HTMLParser可以构建一个DOM树表示HTML文档,方便进行结构化查询和操作。 - ...

    htmlparser(HTML页面解析)例子

    除了基础的开始标签、结束标签和文本数据处理外,HTMLParser还支持处理实体(entities)和属性值。例如,通过重写`handle_entityref`和`handle_charref`可以处理HTML实体,如`&amp;`(代表`&`)和`&lt;`(代表`)。...

    htmlparser解析html分页

    - HTMLParser不支持XML,如果你需要解析XML文档,应使用`xml.parsers.expat`库。 - 解析过程中,需注意内存管理和性能优化,尤其是处理大型HTML文档时。 通过阅读上述文章(链接:...

    Html解析助手htmlparser.jar

    1. **导入库**:在Java项目中,首先需要将`htmlparser.jar`添加到类路径中,以便能够使用其提供的类和方法。 2. **创建解析器**:通过实例化解析器类,如`HtmlParser`,并设置相应的解析模式和配置。 3. **解析HTML*...

    解析htmlparser的所有jar包

    3. **标签和属性处理**:HTMLParser能处理不规范的HTML,因为它设计时考虑到了HTML的非结构化特性。它可以识别并处理标签的嵌套、未闭合的标签以及不正确的属性值。 4. **过滤和转换**:你可以通过自定义处理器或...

    使用HTMLParser解析网页,找出文章后下载保存

    总结来说,使用HTMLParser解析网页涉及到以下步骤: 1. 继承`HTMLParser`并重写相关方法以定义解析逻辑。 2. 找到文章内容所在的标签,如`&lt;p&gt;`或`&lt;article&gt;`,并在适当的方法中处理它们。 3. 收集文章文本,并在适当...

    HtmlParser

    使用HTMLParser,我们可以解析网页内容,提取所需信息,如文章标题、链接、图片等。以下是一些核心概念和步骤: 1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_...

    htmlparser_Java网页解析器

    在事件驱动模式下,HTMLParser会监听并触发一系列的解析事件,如遇到开始标签、结束标签、文本内容等。开发者可以通过注册事件处理器来响应这些事件,从而提取所需的数据。这种方式对于处理大量HTML文档且只需要关注...

    HTMLParser 使用举例

    最后,我们使用 InputStreamReader 对象来读取网页的内容,并使用 HTMLParser 来解析网页。 HTMLParser 是一个功能强大且灵活的类库,用于解析和处理网页内容。它提供了多种使用方式和机制,适合不同的应用场景。

    HTML文档解析器 HTMLParser

    在浏览器加载HTML文档时,它会使用内置的解析器来解析这些标签,并根据它们构建DOM(文档对象模型)树,这个过程就是HTML解析。 HTMLParser是实现这个解析过程的软件组件。它的主要任务包括识别HTML标记、处理嵌套...

    扩展HTMLParser对自定义标签的处理能力

    资源名称:扩展HTMLParser对自定义标签的处理能力内容简介: HTMLParser是一个用来解析HTML文档的开放源码项目,它具有小巧、快速、使用简单的特点以及拥有强大的功能。 现在该项目的最新版本是Integration Build ...

    HTMLParser.net源代码HTMLParser.net使用demo

    4. **事件驱动的解析**:HTMLParser.net提供了一个事件模型,当解析到特定元素或属性时,会触发事件。开发者可以订阅这些事件来实现自定义逻辑。 5. **灵活性**:除了基本的HTML解析,HTMLParser.net还支持XML和SVG...

    android 解析html (htmlParser)库和源码

    因为一个项目需要解析一个网站上的新闻,所以找到了htmlParser这个开源的项目,删除了一些不需要的包,使其可以在android上用。 有两个工程,myhtml是库,要把它包含到dwParser(android工程)工程中,就可以直接...

    htmlparser解析

    htmlparser解析html,获得需要的字段

    htmlparser库与教程

    通过这个教程,开发者可以掌握HTMLParser的基本使用方法,从而有效地从网页中抓取和解析数据。实际应用中,HTMLParser常与网络请求库(如Apache HttpClient或OkHttp)结合使用,以获取远程网页内容,再进行后续的...

    html解析的利器,htmlParser

    例如,可以先用`requests`获取网页源码,然后使用`htmlParser`解析HTML,提取所需信息,最后可能再用`pandas`存储和分析数据。 总结来说,`htmlParser`是一个强大且易用的HTML解析工具,它通过事件驱动的方式让...

    htmlparser.jar文件

    HTMLParser提供了多种方法来访问和操作解析树,比如`parseContent()`用于获取整个文档的节点列表,`visitAllNodesWith()`可以遍历所有节点并应用自定义的访问器,`getFirstNodeWithTag()`用于找到第一个特定标签的...

    android htmlparser解析

    标题已经哼明白了,这里下载下来作为library引入即可。 这里是jar下载:http://sourceforge.net/projects/htmlparser/ (ps:不过导入jar前,要重新编译jar,要不在Android工程了不可用)

Global site tag (gtag.js) - Google Analytics