前段时间,一直在弄html提取问题,可谓道路曲折(当然,现在看来是走了些弯路),现小结一下。
总得来说,一般有三种方法:
第一种方法:直接提取
即只提取除"<........>"之外的的东东,具体实现上,可以直接获取“>........<"之内的文字,也可以先踢出"<...........>"之内的文字。这里给出直接获取“>........<"之内的文字的程序片段。
//用readHtml(filePath);得到body标签中的内容
String str= readHtml(filePath);
StringBuffer buff = new StringBuffer();
int maxindex = str.length() - 1;
int begin = str.indexOf("<body>",0) + 5 ;
int end;
//截取>和<之间的内容
while((begin = str.indexOf('>',begin)) < maxindex - 1)
{
end = str.indexOf('<',begin);
if(end - begin > 1)
{
String strAll,strPart = "";
strAll = str.substring(++begin, end);
strPart += strAll;
buff.append(strPart);
}
注意了,这种方法思路简单,但效果不佳,原因显而易见,主要是html文件的特点及其相关语法决定的。如果你照此思路,结果可能让你多少有些失望,当然如果你要求不高,此法勉强可以接受。
第二种方法:用w3c有关知识
w3c具体知识网上随便百度一下就有一大堆,在此不再罗唆了;
其相关程序附下:
// 得到body标签内容
protected static String getBody(Element rawDoc) {
if (rawDoc == null) {
return "";
}
String body = "";
NodeList children = rawDoc.getElementsByTagName("body");
if (children.getLength() > 0) {
body = getText(children.item(0));
}
return body;
}
// 递归调用,因为标签里面还有标签
protected static String getText(Node node) {
NodeList children = node.getChildNodes();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
switch (child.getNodeType()) {
case Node.ELEMENT_NODE:
sb.append(getText(child));
sb.append(" ");
break;
case Node.TEXT_NODE:
sb.append(((Text) child).getData());
break;
}
}
return sb.toString();
}
说明一下,本方法需要有w3c.dom知识,只有熟练掌握,方可有“正果“可修,建议无畏者(如果你已有此知识积累不算此列)可以尝试,会有不小收获的哦。
第三种:运用正则表达式知识
正则表达式是个好东西哦,小巧灵活,像个小螺丝似的,关键时刻有时还真能发挥大作用,不多说废话,其思想是把我们所不需要的东西剔除掉,思路类似上一 ,但这里为突出正则表达式的作用,就单列了。其有关程序如下:
//得到body标签中的内容
String str= readHtml(filePath);
int begin = str.indexOf("<body",0) + 5 ;
int end = str.length();
str = str.substring(begin, end);
str = str.replaceAll("<[Ss][Cc][Rr][Ii][Pp][Tt].*?</[Ss][Cc][Rr][Ii][Pp][Tt]>", " ");
str = str.replaceAll("<[Ss][Tt][Yy][Ll][Ee].*?</[Ss][Tt][Yy][Ll][Ee]>", " ");
str = str.replaceAll(" ", " ");
str = str.replaceAll("<.*?>", " ");
str = str.replaceAll("\\s+"," ");
有关正则表达式的基础知识在此就不做介绍了。
ok,大体如此而已,这里仅提供大致的思路,当然由于知识有限,见识有限,如有其他好的方法,还希望各位高手指教。
分享到:
相关推荐
readabilityBUNDLE, 一组html内容提取算法 readabilityBUNDLE用Java编写的html主要内容提取。 它将把文章文本提取出来。最近,从html页面中提取主要文章内容是一个挑战性的开放。 有许多开源算法/实现可用。 本项目...
锅炉管-咖啡Boilerpipe html 内容提取器到 Coffeescript 的端口要求需要'htmlparser2' node.js 模块此外,该示例需要“fs”、“request”和“path”模块构建(合并为一个 javascript 文件)需要coffeescript-concat ...
word内容提取 word转html 对样式、字体、图片、表格、等等均支持
给大家带来一款功能强大的批量文本提取器,该软件非常不错,当前支持支持正则表达式,批量提取文本,可以将HTML等文件中指定内容存入数据库、HTML、文本文件,存入数据库的意思是将提取的文本内容直接导入进数据库中...
批量提取HTML/DOC/RTF/TXT等文件中的文本信息。...提取HTML文件中title与body的文本内容 提取HTML文件中textarea的文本内容 提取HTML网页的显示文本内容 提取DOC/RTF等文件中全部文本内容 并可自定义正则表达式获取信息
基于c# 的webbrowser控件,开发的自动提取页面html文档技术实例,能够提取 ajax内容,https内容。
批量提取HTML/DOC/RTF/TXT等文件中的文本信息。 支持从其它网站直接提取文本内容,生成所需数据库文件 支持GB2312/UTF-8多种编码 可将提取信息生成文本文件、HTM网页文件、... 提取HTML文件中title与body的文本内容
支持从压缩的html文档中提取正文内容。 支持带标签输出原始正文。 核心算法简洁高效,平均提取时间在30ms左右。 使用示例: /// /// 文章正文数据模型 /// public class Article { public string ...
java实现用正则表达式的方法提取html中的信息,可以提取标题,正文,链接等。经过运行,没问题的
这段代码是一个简单的Python爬虫,用于爬取链家网站上某个城市的新楼盘信息,并将城市名和链接保存到一个CSV文件中。...整个流程就是初始化CSV文件,发送HTTP请求获取网页内容,解析HTML内容提取数据,最终保存
python,html,内容提取过滤器
NULL 博文链接:https://y-x.iteye.com/blog/1337363
从html文件提取可显示的文本内容。可用于windows和linux环境。
PHP提取html尖括号中的内容,抓取页面内容的时候用得上。
ReadabiliPy包含 Mozilla 的 Node.js 包的 Python 包装器,以及用纯 Python 编写的文章提取例程。 这个包增加了Readability.js的输出,以返回文章段落的纯文本表示列表。 ReadabiliPy带有一个方便的命令行应用...
开发工具:vc6.0 从htm/html格式的网页文件中提取内容。将要提取内容的网页文件用鼠标拖入窗口,按回车即可完成转换。转换后的文件是与原文件同名的文本文件。支持文件夹批量转换!
.NET平台下,一个高效的从Html中提取正文的工具。正文提取采用了基于文本密度的提取算法,支持从压缩的Html文档中提取正文,每个页面平均提取时间为30ms,正确率在95%以上。
Html内容/文章提取器,Python中的web爬虫
具体从http://www.veryhuo.com提取中间演示textarea内的html文本,从(网页特效代码)->(详细分类)->html网页中textarea内容,程序内使用了1.多线程 2.正则表达式 3.web文件读取 4.本地文件保存及编码问题。线程挂起没...
C++读取html内容,支持HTTPS,只包含cpp,h文件,可以应用到任何C++项目经理