java版 正文抽取 基于文字连接比
package cn.tdt.crawl.jdbc;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; public class HtmlExtract {
private static double linkTextRadio = 0.25; // 链接文字比 // 过滤不必要的数据
public static String filterContent(String str) {
if (str == "") {
return "";
}
str = str.replaceAll("(?is)<!DOCTYPE.*?>", "");
str = str.replaceAll("(?is)<!--.*?-->", "");
str = str.replaceAll("(?is)<script.*?>.*?</script>", "");
str = str.replaceAll("(?is)<style.*?>.*?</style>", "");
// str=str.replaceAll("&.{2,5};|&#.{2,5};", " ");
return str;
} // 计算链接数
public static int calcLinks(Element node) {
Elements links = node.select("a[href]");
return links.size();
} // 计算内容长度
public static double calcWords(Element node) {
String con = node.text();
if (con.length() == 0) {
return 1 + linkTextRadio;
} else {
return con.length();
}
} // 计算标点符号的个数
public static int calcSign(Element node) {
String[] sign = { ",", ";", ".", "\"", "'", "\\?", "。", ":", "," };
int i = 0;
for (String ch : sign) {
int count = 0;
count = node.text().split(ch).length - 1;
i = +count;
}
return i;
} // 将所有的空节点全部删除
public static Element drawCon(Element node) {
if (node.tagName() == "a") {
// 这个就不用进去深入了
return node;
}
int links; // 链接数
double words; // 文字长度
double cellRatio;
int signs; // 符号出现的情况 Elements nodes = node.children();
for (Element cnode : nodes) {
if (!cnode.hasText()) {
// System.out.println("删除"+cnode);
cnode.remove();
} else {
links = calcLinks(cnode);
words = calcWords(cnode);
cellRatio = links / words;
signs = calcSign(cnode);
if (signs < 1) {
// 删除没有标点符号的节点
cnode.remove();
} else if (cellRatio > linkTextRadio) {
cnode.remove();
} else {
drawCon(cnode);
}
}
}
return node;
} // 提取标题
private String drawTitle(String str) {
// TODO Auto-generated method stub
// 先取页面的title部分的值
if (str.length() < 1) {
return null;
}
String tit = "";
int xhpos = -1; // 下划线的位置
int zhpos = -1; // 中横线的位置
Pattern pt = Pattern.compile("<title>(.*)</title>",
Pattern.CASE_INSENSITIVE);
Matcher mc = pt.matcher(str);
if (mc.find()) {
tit = mc.group(1).trim();
// 下面需要过滤一下,有些标题会加上下划线或者中横线
xhpos = tit.indexOf("_");
zhpos = tit.indexOf("|");
if (xhpos > 0) {
tit = tit.substring(0, xhpos);
}
if (zhpos > 0) {
tit = tit.substring(0, zhpos);
}
} return tit;
} // 提取作者
private String[] drawAuthor(String str) {
if (str.length() < 1) {
return null;
}
// 这种信息一般就是直接用正则就好
String[] author = new String[2];
int tPos = 0; // 日期所在的位置
Pattern pt = Pattern.compile(
"作者.+(\\d{4}[-|年]\\d{1,2}[-|月]\\d{1,2}[日]?)",
Pattern.CASE_INSENSITIVE);
Matcher mc = pt.matcher(str);
if (mc.find()) {
// System.out.println("123");
author[0] = mc.group(1); // 存储日期信息
tPos = mc.group().trim().indexOf(author[0]);
author[1] = mc.group().trim().substring(0, tPos);
return author;
}
return null;
} // 核心处理函数
public String[] extract(String str) {
String title; // 标题
//String author = ""; // 作者
//String uptime = ""; // 发布时间
String content; // 正文
//String[] authors = new String[2]; str = filterContent(str);
Document doc = Jsoup.parse(str);
// 取body
Element bodynode = doc.select("body").first();
title = drawTitle(str);
//authors = drawAuthor(str);
// 开始遍历节点,进行去噪处理,抽取正文
content = drawCon(bodynode).text();
// 防止溢出
// if (authors.length > 1) {
// author = authors[1];
// uptime = authors[0];
// }
// System.out.println(title);
// System.out.println(author);
// System.out.println(uptime);
// System.out.println(content);
String[] arr = new String[2];
arr[0] = title;
arr[1] = content;
return arr;
} public static void main(String[] args){ } }
java版 正文抽取 基于文字连接比的更多相关文章
- 基于opencv将视频转化为字符串Java版
基于opencv将视频转化为字符串Java版 opencv java 先上一个效果图吧 首先,弄清一下原理 我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化 ...
- java版gRPC实战之七:基于eureka的注册发现
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 网页爬虫的设计与实现(Java版)
网页爬虫的设计与实现(Java版) 最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/deve ...
- 编写你的第一个 Java 版 Raft 分布式 KV 存储
前言 本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目.该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现:该项目 ...
- Java版分布式ID生成器技术介绍
分布式全局ID生成器作为分布式架构中重要的组成部分,在高并发场景下承载着分担数据库写瓶颈的压力. 之前实现过PHP+Swoole版,性能和稳定性在生产环境下运行良好.这次使用Java进行重写,目前测试 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- 推荐一款自研的Java版开源博客系统OneBlog
OneBlog 一款超好用的Java版开源博客 Introduction 简介 OneBlog 一个简洁美观.功能强大并且自适应的Java博客.使用springboot开发,前端使用Boot ...
- java版gRPC实战之一:用proto生成代码
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- 动作-CCActionInterval之CCAnimation&CCAnimate
动画简单实例 v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#def ...
- win7 设置自动关机
1.C:\Windows\System32\shutdown.exe 2. -s:表示关机: -r:表示重启: -t:表示时间,以秒为单位: -a:表示取消shutdown计划,即表示取消关机或重启命 ...
- yum在线升级
RPM优点 由於 RPM 是透过预先编译并打包成为 RPM 文件格式后,再加以安装的一种方式,并且还能够进行数据库的记载. 所以 RPM 有以下的优点: RPM 内含已经编译过的程序与配置档等数据,可 ...
- Hibernate事务管理
User类: public class User implements Serializable{ public User(){} private Integer id; private String ...
- 简论数据库乐观悲观锁与并发编程中的CAS
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5783205. ...
- <input> 标签
HTML5 中的新属性. 属性 值 描述 accept mime_type 规定通过文件上传来提交的文件的类型. align left right top middle bottom 不赞成使用. ...
- jsp页面中frameset的使用方法
frame,是网页开发必须掌握的知识.例如后台架构.局部刷新,页面分割,都是frame的用途表现,尤其是后台页面制作,使用frame会给用户带来非常舒适的使用感受. frame知识点包括(frames ...
- C# Callback 回调实用讲解 [原创]
这个是2011年写的一个技术贴,现在看可能有点过时了,有兴趣的朋友也可以看一下. 一. 描述 在开发winform程序时不会考虑页面刷新问题,只要控制好线程别导致假死就ok了,但是在开发web页面程序 ...
- MVC小系列(十九)【mvc与站点地图】
我的MvcSiteMap地图主要由实体文件,XML配置文件,C#调用文件组成,当然为了前台调用方法,可以为HtmlHelper添加一个扩展方法 第一步 定义站点地图实体 public class Mv ...
- 数据库连接池php-cp介绍
php-cp(php-connect-pool)是用php扩展写的一个数据库连接池. 我们知道php开发速度快,适合创业快速迭代,但当流量大了之后,php大量的短连接给db层造成多余的消耗,而php处 ...