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 ...
随机推荐
- 如何从零开始学习DIV+CSS
CSS是样式,DIV是层.DIV+CSS是网站标准(web标准),通常为了说明与HTML网页设计语言中的表格(table)定位方式的区别.因为XHTML网站设计标准中,不再使用表格定位技术,而是采用D ...
- [转] JAVA正则表达式:Pattern类与Matcher类详解(转)
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和 Matcher Pattern 一个Pattern是一个正则表达式经编译后的 ...
- java与.net比较学习系列开发环境和常用调试技巧常用操作快捷键
调试 F5 F11 调试运行 CTRL+F5 暂无 非调试运行 F6 不适用 编译整个解决方案 SHIFT+F6 不适用 编译当前选择的工程 SHIFT+F5 CTRL ...
- Eclipse启动Tomcat访问不了首页
Eclipse开发web项目与myEclipse不同: 启动服务器后访问 http:localhost:8080 找不到服务器 想要访问Tomcat首页只需修改Tomcat配置 进入Eclipse双击 ...
- HttpClient4.4 进行Http连接通讯
以前一直使用jdk自带的urlConnection来进行http通讯,HttpClient与之相比,HttpClient更具有灵活度和易用性.HttpClient能够方便使用连接池,使用时需要重新创建 ...
- Centos如何设置静态IP地址,LINUX怎么修改IP地址
1.登陆连接centos系统,输入 ifconfig 可以查看到当前本机的IP地址信息 2.临时设置IP地址: 输入 ifconfig eth0 (默认是第一个网卡) 后面接IP地址, 网络掩码和 网 ...
- Linux SSh scp使用【远程文件/目录的传输】
一:Linux ssh scp的简介及作用: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们 ...
- js表格的输出
<html> <head> <title>隔行变色</title> <script type="text/javascript" ...
- 浅谈C#随机数发生器
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机不 可 ...
- Spring的多配置文件加载
如果配置文件存在多个的情况下,加载配置文件的方式是:1--可以指定总的配置文件去包含子的配置文件,然后只加载总的配置文件即可在总配置文件applicationContext.xml 中引入子文件 &l ...