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

从HTML抽取纯文本

阅读更多

spider中需要提取纯文本:

1.javax.swing.text

这种方法比较麻烦,自己写很多的callback,效率很低,效果不见得好

2.htmlparser

方便,但是不规则的htm效果太差,总是遗留大量的tag

package testlucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;

/**
 * 演示了Html Parse的应用.
 * 
 * @author scud http://www.jscud.com
 */

public class HtmlParser {

	public static void main(String[] args) throws Exception {
		String aFile = "d:/1.html";

		String content = readTextFile(aFile, "GBK");

		// System.out.println(test1(content));

		// test2(content);
		// System.out.println("====================================");

		System.out.println(getText(content));
		// System.out.println("====================================");

		// test4(content);
		// System.out.println("====================================");

		// test5(aFile);
		// SSystem.out.println("====================================");

	}

	/**
	 * 读取文件的方式来分析内容. filePath也可以是一个Url.
	 * 
	 * @param resource
	 *            文件/Url
	 */
	public static void test5(String resource) throws Exception {
		Parser myParser = new Parser(resource);

		// 设置编码
		myParser.setEncoding("GBK");

		HtmlPage visitor = new HtmlPage(myParser);

		myParser.visitAllNodesWith(visitor);

		String textInPage = visitor.getTitle();

		System.out.println(textInPage);
	}

	/**
	 * 得到普通文本和链接的内容.
	 * 
	 * 使用了过滤条件.
	 */
	public static String getText(String content) throws ParserException {
		Parser myParser;
		NodeList nodeList = null;
		StringBuilder result = new StringBuilder();
		myParser = Parser.createParser(content, "GBK");

		NodeFilter textFilter = new NodeClassFilter(TextNode.class);
		NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);

		// 暂时不处理 meta
		// NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);

		OrFilter lastFilter = new OrFilter();
		lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });

		nodeList = myParser.parse(lastFilter);

		Node[] nodes = nodeList.toNodeArray();
		String line = "";

		for (int i = 0; i < nodes.length; i++) {
			Node anode = (Node) nodes[i];

			if (anode instanceof TextNode) {
				TextNode textnode = (TextNode) anode;
				// line = textnode.toPlainTextString().trim();
				line = textnode.getText();
			} else if (anode instanceof LinkTag) {
				LinkTag linknode = (LinkTag) anode;

				line = linknode.getLink();
				// @todo 过滤jsp标签:可以自己实现这个函数
				// line = StringFunc.replace(line, "<%.*%>", "");
			}

			if (isTrimEmpty(line))
				continue;

			// System.out.println(line);
			result.append(line);
		}

		return result.toString();
	}

	/**
	 * 读取一个文件到字符串里.
	 * 
	 * @param sFileName
	 *            文件名
	 * @param sEncode
	 *            String
	 * @return 文件内容
	 */
	public static String readTextFile(String sFileName, String sEncode) {
		StringBuffer sbStr = new StringBuffer();

		try {
			File ff = new File(sFileName);
			InputStreamReader read = new InputStreamReader(new FileInputStream(
					ff), sEncode);
			BufferedReader ins = new BufferedReader(read);

			String dataLine = "";
			while (null != (dataLine = ins.readLine())) {
				sbStr.append(dataLine);
				sbStr.append("\r\n");
			}

			ins.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return sbStr.toString();
	}

	/**
	 * 去掉左右空格后字符串是否为空
	 * 
	 * @param astr
	 *            String
	 * @return boolean
	 */
	public static boolean isTrimEmpty(String astr) {
		if ((null == astr) || (astr.length() == 0)) {
			return true;
		}
		if (isBlank(astr.trim())) {
			return true;
		}
		return false;
	}



	/**
	 * 字符串是否为空:null或者长度为0.
	 * 
	 * @param astr
	 *            源字符串.
	 * @return boolean
	 */
	public static boolean isBlank(String astr) {
		if ((null == astr) || (astr.length() == 0)) {
			return true;
		} else {
			return false;
		}
	}

}
 

3.regex

很简单,很实用,会丢失信息,对js不太支持,不过可以与处理一下

 text = Scontent.replaceAll("<[^>]*>","");    
		
 

4.自己处理,可以用些设计模式,留待有空时做。

 

分享到:
评论

相关推荐

    unmark:从Markdown中提取纯旧文本

    取消标记从Markdown中提取纯旧文本#Installation bower install unmark #用法简单如下: &lt; html &gt;&lt; head &gt; &lt; script type =" text/javascript " src =" bower_components/unmark/unmark.js " &gt; &...

    Python-一个简单的库和命令行实用程序用以从HTML页面或者明文中抽取摘要

    一个简单的库和命令行实用程序,用以从HTML页面或者明文中抽取摘要。该包也包含用于文本摘要的简单评价框架。

    正则表达式经典实例.pdf

    8.5 添加p和br标签将纯文本转换为HTML 8.6 在XML风格的标签中查找某个特定属性 8.7 向不包含cellspacing属性的 table标签中添加该属性 8.8 删除XML风格的注释 8.9 在XML风格的注释中查找单词 8.10 替换在CSV文件中...

    正则表达式经典实例

    8.5 添加p和br标签将纯文本转换为HTML 8.6 在XML风格的标签中查找某个特定属性 8.7 向不包含cellspacing属性的 table标签中添加该属性 8.8 删除XML风格的注释 8.9 在XML风格的注释中查找单词 8.10 替换在CSV...

    纯web前端抽奖程序

    如果你希望使用用户姓名进行简单的抽取,就可以使用它,操作简单使用方便,里面纯源码,也可以根据你的喜好进行修改。(如果你想去掉浏览器边框让其看其看起来更高逼格,可以按F11,进入全屏模式),如果想修改抽奖...

    JAVA上百实例源码以及开源项目源代码

    利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个...

    Java开源的xpath解析器Jsoupxpath.zip

    num()抽取节点自有文本中全部数字,如果知道节点的自有文本(即非子代节点所包含的文本)中只存在一个数字,如阅读数,评论数,价格等那么直接可以直接提取此数字出来。如果有多个数字将提取第一个匹配的连续数字。...

    JAVA上百实例源码以及开源项目

    利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个...

    java开源包1

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包11

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包2

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包3

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包6

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包5

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包10

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包4

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包8

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包7

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

    java开源包9

    BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4...

Global site tag (gtag.js) - Google Analytics