截取一定长度带有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);
}
}
分享到:
相关推荐
资源名称:扩展HTMLParser对自定义标签的处理能力内容简介: HTMLParser是一个用来解析HTML文档的开放源码项目,它具有小巧、快速、使用简单的特点以及拥有强大的功能。 现在该项目的最新版本是Integration Build ...
当找到`<title>`标签时,我们提取并打印出网页的标题。 HTMLParser库还支持更复杂的操作,例如根据CSS选择器定位元素、处理属性、遍历子节点等。例如,如果要抓取所有的`<a>`标签及其链接,可以这样修改代码: ```...
例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`<a>`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....
本篇文章将详细介绍如何使用HTMLParser来实现HTML摘要的截取。 首先,我们需要理解HTML摘要的含义。在网页中,摘要通常是指一段能够概括页面主要内容的文字,它有助于读者快速了解页面的主题。搜索引擎也会使用摘要...
1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_starttag`、`handle_endtag`和`handle_data`,以便在遇到HTML标签开始、结束或数据时执行特定操作。 2. **启动爬虫*...
为了使用这个解析器,我们需要创建一个实例,并调用`feed()`方法,传入要解析的HTML字符串或文件内容。例如: ```python parser = MyHTMLParser() with open('网页.html', 'r') as file: parser.feed(file.read())...
3. **解析HTML**:学习如何使用`HTMLParser`实例解析HTML字符串或从URL读取HTML内容。这通常涉及到创建`Parser`对象,然后调用`parse()`方法。 4. **遍历和访问HTML元素**:HTMLParser提供了对HTML文档节点的遍历...
标签`c# htmlparser`表明这个库是为C#语言设计的,这意味着它可以无缝集成到任何.NET Framework或.NET Core项目中,利用C#的特性如 LINQ 来简化数据提取。 标签`dll`提醒我们这个库是以DLL形式提供的,这意味着它是...
2. **创建解析器**:通过实例化解析器类,如`HtmlParser`,并设置相应的解析模式和配置。 3. **解析HTML**:调用解析器的`parse`方法,传入HTML源码或输入流,开始解析过程。 4. **处理解析事件**:注册事件处理器,...
1. **解析HTML**:HTMLParser可以解析任意的HTML字符串或文件,即使这些HTML文档中存在语法错误或不规范的情况,它也能尽可能地恢复和解析。 2. **事件驱动模式**:当解析到HTML元素时,例如`<tag>`,HTMLParser会...
`org.htmlparser.lexer.Source`类代表一个HTML源,`org.htmlparser.lexer.Page`类则封装了HTML页面的信息,包括字符编码、URL等。`Lexer`类则是词法分析的核心,它会生成一系列的标记,供`Parser`进一步处理。`Lexer...
HTMLParser通常会提供一个解析器类,通过这个类,我们可以读取HTML字符串或文件,并将其转换为可操作的对象模型。例如,我们可以使用解析器的`ParseDocument`方法解析HTML源代码,然后通过这个文档对象来访问DOM...
5. **字符编码识别**:HTMLParser可以自动检测HTML文档的字符编码,确保正确地处理各种语言的字符。 6. **DOM树构建**:虽然HTMLParser主要是事件驱动的,但也可以通过`HTMLNode`类构建一个DOM树,便于对整个HTML...
HTMLParser.jar包是一款专门用于解析HTML网页的框架,它的特点是运行速度快且体积小巧,因此在处理HTML解析任务时,能够高效地完成工作。这个框架主要适用于那些需要从HTML文档中提取数据、分析网页结构或者进行自动...
虽然这个帮助文档目前只有英文版,但对于熟悉英语的开发者来说,查阅这些文档是理解并有效利用HTMLPARSER的关键。文档通常会包含API的详细介绍、示例代码以及常见问题解答等内容,帮助开发者快速上手。遗憾的是,...
- **标签识别**:HTMLParser能够识别并处理HTML文档中的各种标签,如`<div>`、`<p>`、`<a>`等,同时支持自定义标签。 - **属性解析**:解析HTML元素的属性,例如`href`、`class`等,并提供访问这些属性的API。 - *...
下面的代码示例展示了如何读取HTML文件的内容,并利用`HtmlParser`从中提取第一个`<table>`标签的相关信息。 #### 示例代码分析 首先,我们需要读取HTML文件的内容。这里使用了`BufferedReader`和`...
HTMLParser提供了多种方法来访问和操作解析树,比如`parseContent()`用于获取整个文档的节点列表,`visitAllNodesWith()`可以遍历所有节点并应用自定义的访问器,`getFirstNodeWithTag()`用于找到第一个特定标签的...
总的来说,HTMLParser 2.0是Python中一个实用的HTML解析工具,虽然相对基础,但能帮助开发者完成许多基本的HTML解析任务。通过熟练掌握其使用,可以更高效地处理HTML文档,从而在数据提取和信息分析中发挥重要作用。
在这个压缩包中,你可能找到了HTMLParser项目的所有必需jar包,这将帮助你全面地利用这个库的功能。 HTMLParser的核心功能包括: 1. **解析HTML**:HTMLParser可以读取HTML文档并将其转换为一个可操作的DOM...