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 ...
随机推荐
- Open quote is expected for attribute "{1}" associated with an element type "name".
xml属性必须用引号“”,不能缺少.
- leecode 每日解题思路 102-Binary Tree Level Order Traversal
題目描述: 题目链接: 102-Binary Tree Level Order Traversal 这个问题要解决的是如何逐层遍历一个二叉树,并把同一层元素放入同一list中, 再将所有元素返回. 其 ...
- PHP【第一篇】安装
一.准备 1.环境 系统平台:Red Hat Enterprise Linux Server release 7.3 (Maipo) 内核版本:3.10.0-514.el7.x86_64 2.下载安装 ...
- Android5.0之Toobar的使用
总体上来说,Toolbar的使用可以分为两个方面,一方面是将ToolBar当作ActionBar来用,另一方面就是将Toolbar当成一个单独的控件来用,不过到目前为止我见到的大部分情况都是把Tool ...
- iOS之NSURLSessionDownloadTask下载
#import "ViewController.h" @interface ViewController ()<NSURLSessionDownloadDelegate,NS ...
- 关于Java安全的书
关于Java安全的书http://automationqa.com/forum.php?mod=viewthread&tid=2831&fromuid=21
- [转]Form Builder:app_field.clear_dependent_fields和APP_FIELD.set_dependent_field的用法
转自:http://www.cnblogs.com/toowang/p/3668070.html 可以调用APP_FIELD.clear_dependent_fields和APP_FIELD.set_ ...
- Linux查看磁盘块大小
首先,使用df命令查看所在磁盘 df -hT 显示: Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 ext4 15G .1G 12 ...
- Linux SSh scp使用【远程文件/目录的传输】
一:Linux ssh scp的简介及作用: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们 ...
- JavaScript平常会跳的坑系列(一)
function Foo() { //定义foo函数 getName = function () { console.log('1');}; console.log(this); return thi ...