`
wesee
  • 浏览: 23734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用HtmlParser 完成含有html标签的字符截取并补全标签

阅读更多
截取一定长度带有HTML标签的文件内容,如果按普通文字用subtring进行截取的,当把html标签载断而非完整闭合时,整个页面都可能因此而变形, 利用HtmlParser可以很好的保留原HTML标签并将载段的标签补齐。

应该注意一点<strong>***</strong>标签需要重新定义,因为现在strong标签的getEndTag() 是null不知道是不是htmlparser的一个bug

package com.test.util;

import java.util.Stack;
import org.htmlparser.tags.CompositeTag;

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.ParserException;

public class SubstringHTML {

	private final String CONTENT;
	private Parser parser;
	private Stack<TagNode> nodeStack;
	private int subLength;
	private int textLength = 0;
	private int pos = 0;

	public SubstringHTML(String content) {
		CONTENT = content;

		parser = Parser.createParser(content, "GBK");
		factory = new PrototypicalNodeFactory();
		factory.registerTag(new StrongTag());
		parser.setNodeFactory(factory);

		nodeStack = new Stack<TagNode>();
	}

	private void recusive(NodeIterator iterator) throws ParserException  {
		
		while (iterator.hasMoreNodes()) {
			Node node = iterator.nextNode();
			if (node instanceof TagNode) {
				TagNode tagNode = (TagNode)node;
				Tag tag = tagNode.getEndTag();
				
				if (tag != null) {
					nodeStack.push(tagNode);
				}
			}
			else if (node instanceof TextNode) {
				if (node.getText().trim().length() == 0) {
					continue;
				}
				
                if (node.getTagName.equals("SCRIPT") {
                	continue;      
                }

				String nodeText = node.getText();
				int tLen = nodeText.length();
				if ((textLength < subLength) && ((textLength + tLen) > subLength)) {
					pos = node.getStartPosition() + subLength - textLength;
					textLength = subLength;
					return;
				}
				else {
					textLength += tLen;
					pos = node.getEndPosition();
				}
			}
			
			if (node.getChildren() == null) {
				continue;
			}
			recusive(node.getChildren().elements());
			
			if (subLength <= textLength) {
				return;
			}
		}
	}

	public String subString(int length, String end) {
		if (length >= CONTENT.length() || length <= 0) {
			return CONTENT;
		}

		subLength = length;
		try {
			recusive(parser.elements());
		} catch (ParserException e) {
			System.out.println("parser error:" + e.getMessage());
			return CONTENT;
		}

		int size = nodeStack.size();
		StringBuffer buffer = new StringBuffer();
		buffer.append(CONTENT.substring(0, pos));

		while (size > 0) {
			TagNode node = nodeStack.pop();
			size--;

			if (node.getEndTag().getEndPosition() <= pos || node.getTagBegin() >= pos) {
				continue;
			}

			buffer.append("</");
			buffer.append(node.getTagName());
			buffer.append(">");
		}

		buffer.append(end);
		return buffer.toString();
	}

	private static String getContent() {
		byte[] con = null;
		InputStream in = SubstringHTML.class.getResourceAsStream("content.txt");
		try {
			int length = in.available();
			con = new byte[length];
			in.read(con, 0, length);
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			return new String(con, "GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return "";
		}
	}

	public static void main(String[] args) {
		String content = getContent();
		SubstringHTML app = new SubstringHTML(content);
		String str = app.subString(200, "");
		System.out.println(str);
	}
}

class StrongTag extends CompositeTag {
	private static final long serialVersionUID = 1L;
	private static final String[] mIds = new String[] { "STRONG" };
        private static final String[] mEndTagEnders = new String[] {"BODY", "HTML"};

	public String[] getIds() {
		return mIds;
	}

	public String[] getEndTagEnders ()
	{
		return (mEndTagEnders);
	}
}
0
0
分享到:
评论
1 楼 javalucky 2010-03-03  
怎么不加一下注释啊

相关推荐

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

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

    java利用htmlparser抓取网页数据

    当找到`&lt;title&gt;`标签时,我们提取并打印出网页的标题。 HTMLParser库还支持更复杂的操作,例如根据CSS选择器定位元素、处理属性、遍历子节点等。例如,如果要抓取所有的`&lt;a&gt;`标签及其链接,可以这样修改代码: ```...

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

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

    用htmlparser截取html摘要实现源码

    本篇文章将详细介绍如何使用HTMLParser来实现HTML摘要的截取。 首先,我们需要理解HTML摘要的含义。在网页中,摘要通常是指一段能够概括页面主要内容的文字,它有助于读者快速了解页面的主题。搜索引擎也会使用摘要...

    HtmlParser

    1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_starttag`、`handle_endtag`和`handle_data`,以便在遇到HTML标签开始、结束或数据时执行特定操作。 2. **启动爬虫*...

    htmlparser(HTML页面解析)例子

    为了使用这个解析器,我们需要创建一个实例,并调用`feed()`方法,传入要解析的HTML字符串或文件内容。例如: ```python parser = MyHTMLParser() with open('网页.html', 'r') as file: parser.feed(file.read())...

    htmlparser库与教程

    3. **解析HTML**:学习如何使用`HTMLParser`实例解析HTML字符串或从URL读取HTML内容。这通常涉及到创建`Parser`对象,然后调用`parse()`方法。 4. **遍历和访问HTML元素**:HTMLParser提供了对HTML文档节点的遍历...

    c#版htmlparser htmlparser.dll htmlparser源代码

    标签`c# htmlparser`表明这个库是为C#语言设计的,这意味着它可以无缝集成到任何.NET Framework或.NET Core项目中,利用C#的特性如 LINQ 来简化数据提取。 标签`dll`提醒我们这个库是以DLL形式提供的,这意味着它是...

    Html解析助手htmlparser.jar

    2. **创建解析器**:通过实例化解析器类,如`HtmlParser`,并设置相应的解析模式和配置。 3. **解析HTML**:调用解析器的`parse`方法,传入HTML源码或输入流,开始解析过程。 4. **处理解析事件**:注册事件处理器,...

    htmlparser1.4完整包下载

    1. **解析HTML**:HTMLParser可以解析任意的HTML字符串或文件,即使这些HTML文档中存在语法错误或不规范的情况,它也能尽可能地恢复和解析。 2. **事件驱动模式**:当解析到HTML元素时,例如`&lt;tag&gt;`,HTMLParser会...

    htmlparser的jar包

    `org.htmlparser.lexer.Source`类代表一个HTML源,`org.htmlparser.lexer.Page`类则封装了HTML页面的信息,包括字符编码、URL等。`Lexer`类则是词法分析的核心,它会生成一系列的标记,供`Parser`进一步处理。`Lexer...

    C# HTMLParser下载.rar

    HTMLParser通常会提供一个解析器类,通过这个类,我们可以读取HTML字符串或文件,并将其转换为可操作的对象模型。例如,我们可以使用解析器的`ParseDocument`方法解析HTML源代码,然后通过这个文档对象来访问DOM...

    htmlparser1.6最新版

    5. **字符编码识别**:HTMLParser可以自动检测HTML文档的字符编码,确保正确地处理各种语言的字符。 6. **DOM树构建**:虽然HTMLParser主要是事件驱动的,但也可以通过`HTMLNode`类构建一个DOM树,便于对整个HTML...

    htmlParser.jar包

    HTMLParser.jar包是一款专门用于解析HTML网页的框架,它的特点是运行速度快且体积小巧,因此在处理HTML解析任务时,能够高效地完成工作。这个框架主要适用于那些需要从HTML文档中提取数据、分析网页结构或者进行自动...

    HTMLPARSER2.0 JDK包

    虽然这个帮助文档目前只有英文版,但对于熟悉英语的开发者来说,查阅这些文档是理解并有效利用HTMLPARSER的关键。文档通常会包含API的详细介绍、示例代码以及常见问题解答等内容,帮助开发者快速上手。遗憾的是,...

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

    - **标签识别**:HTMLParser能够识别并处理HTML文档中的各种标签,如`&lt;div&gt;`、`&lt;p&gt;`、`&lt;a&gt;`等,同时支持自定义标签。 - **属性解析**:解析HTML元素的属性,例如`href`、`class`等,并提供访问这些属性的API。 - *...

    JAVA htmlparser 使用实例

    下面的代码示例展示了如何读取HTML文件的内容,并利用`HtmlParser`从中提取第一个`&lt;table&gt;`标签的相关信息。 #### 示例代码分析 首先,我们需要读取HTML文件的内容。这里使用了`BufferedReader`和`...

    htmlparser.jar文件

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

    HTMLParser 2.0

    总的来说,HTMLParser 2.0是Python中一个实用的HTML解析工具,虽然相对基础,但能帮助开发者完成许多基本的HTML解析任务。通过熟练掌握其使用,可以更高效地处理HTML文档,从而在数据提取和信息分析中发挥重要作用。

    解析htmlparser的所有jar包

    在这个压缩包中,你可能找到了HTMLParser项目的所有必需jar包,这将帮助你全面地利用这个库的功能。 HTMLParser的核心功能包括: 1. **解析HTML**:HTMLParser可以读取HTML文档并将其转换为一个可操作的DOM...

Global site tag (gtag.js) - Google Analytics