Java精确抽取网页发布时间

对网页中各种不同格式的发布时间进行抽取,将发布时间以规整的“yyyy-MM-dd HH:mm:ss”格式表示出来,只能尽量追求精确,但是因为网络发布时间的格式十分灵活,所以做不到百分百地正确抽取

package whu.extract.pubtime.core;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import whu.utils.TimeUtil;

/**
 * Created On 2014年3月13日 下午2:49:05
 * @description 获取网页的发布时间
 */
public class FetchPubTime {
  /** 表示url中连续的8位日期,例如http://www.baidu.com/20140311/2356.html */
  private static String url_reg_whole= "([-|/|_]{1}20\\d{6})";
  /** 表示 用-或者/隔开的日期,有年月日的,例如 http://www.baidu.com/2014-3-11/2356.html */
  private static String url_reg_sep_ymd = "([-|/|_]{1}20\\d{2}[-|/|_]{1}\\d{1,2}[-|/|_]{1}\\d{1,2})";
  /** 表示 用-或者/隔开的日期,只有年和月份的,例如 http://www.baidu.com/2014-3/2356.html */
  private static String url_reg_sep_ym = "([-|/|_]{1}20\\d{2}[-|/|_]{1}\\d{1,2})";
  private static Calendar current = Calendar.getInstance();
  /** 格式正确的时间正则表达式*/
  private static String rightTimeReg = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$";

  /**
   * @param url
   * @param urlContent
   * @return
   */
  public static String getPubTimeVarious(String url,String urlContent) {

    String pubTime = getPubTimeFromUrl(url);

   //链接里面没有,匹配文本中的
    if(pubTime == null)
    {
      if(urlContent!=null&&!urlContent.trim().equals(""))
        return extractPageDate(urlContent);
    }

    return pubTime;
  }

  /**从url里面抽取出发布时间,返回YYYY-MM-DD HH:mm:ss格式的字符串
   * @param url
   * @return
   */
  public static String getPubTimeFromUrl(String url)
  {
    Pattern p_whole = Pattern.compile(url_reg_whole);
    Matcher m_whole = p_whole.matcher(url);
    if(m_whole.find(0)&&m_whole.groupCount()>0)
    {
      String time = m_whole.group(0);
      time = time.substring(1,time.length());
      //每一步都不能够超出当前时间
    if(current.compareTo(TimeUtil.strToCalendar(time, "yyyyMMdd"))>=0)
    {

      return time.substring(0,4)+"-"+time.substring(4,6)+"-"+
         time.substring(6,8)+" "+"00:00:00";
    }
    }

    p_whole = null;
    m_whole = null;
    Pattern p_sep = Pattern.compile(url_reg_sep_ymd);
    Matcher m_sep = p_sep.matcher(url);
    if(m_sep.find(0)&&m_sep.groupCount()>0)
    {
       String time = m_sep.group(0);
       time = time.substring(1,time.length());
       String[] seg = time.split("[-|/|_]{1}");
       Calendar theTime = Calendar.getInstance();
       theTime.set(Calendar.YEAR,Integer.parseInt(seg[0]));
       theTime.set(Calendar.MONTH, Integer.parseInt(seg[1]));
       theTime.set(Calendar.DAY_OF_MONTH, Integer.parseInt(seg[2]));
       if(current.compareTo(theTime)>=0)
        {

      return seg[0]+"-"+seg[1]+"-"+seg[2]+" "+"00:00:00";
        }
    }
    p_sep = null;
    m_sep = null;
    Pattern p_sep_ym = Pattern.compile(url_reg_sep_ym);
    Matcher m_sep_ym = p_sep_ym.matcher(url);
    if(m_sep_ym.find(0)&&m_sep_ym.groupCount()>0)
    {
       String time = m_sep_ym.group(0);
       time = time.substring(1,time.length());
       Calendar theTime = Calendar.getInstance();
       String[] seg = time.split("[-|/|_]{1}");
       theTime.set(Calendar.YEAR,Integer.parseInt(seg[0]));
       theTime.set(Calendar.MONTH, Integer.parseInt(seg[1]));
       theTime.set(Calendar.DAY_OF_MONTH, 1);
       if(current.compareTo(theTime)>=0)
      {

      return seg[0]+"-"+seg[1]+"-"+"01"+" "+"00:00:00";
      }
    }

    return null;
  }

  /** 从网页源码中取出发布时间
   * java中正则表达式提取字符串中日期实现代码
   * 2013年12月19日15:58:42
   * 读取出2013-12-19 15:48:33或者2013-12-19或者2012/3/05形式的时间
   * @param text 待提取的字符串
   * @return 返回日期
   * @author: oschina
   * @Createtime: Jan 21, 2013
   */
  public static String extractPageDate(String text) {
    boolean containsHMS =false;
    String dateStr = text.replaceAll("r?n", " ");
    try {
      List matches = null;
      Pattern p_detail = Pattern.compile("(20\\d{2}[-/]\\d{1,2}[-/]\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2})|(20\\d{2}年\\d{1,2}月\\d{1,2}日)", Pattern.CASE_INSENSITIVE|Pattern.MULTILINE);
      //如果是仅仅抽取年月日,则按照上面的,如果是抽取年月日-时分秒,则按照下面的
      Pattern p = Pattern.compile("(20\\d{2}[-/]\\d{1,2}[-/]\\d{1,2})|(20\\d{2}年\\d{1,2}月\\d{1,2}日)", Pattern.CASE_INSENSITIVE|Pattern.MULTILINE);
      //Matcher matcher = p.matcher(dateStr);
      Matcher matcher_detail = p_detail.matcher(dateStr);

      if(!(matcher_detail.find(0) && matcher_detail.groupCount() >= 1))
      {
        matcher_detail = p.matcher(dateStr);
        containsHMS = true;
      }else
        matcher_detail = p_detail.matcher(dateStr);
      if (matcher_detail.find() && matcher_detail.groupCount() >= 1) {
        matches = new ArrayList();
        for (int i = 1; i <= matcher_detail.groupCount(); i++) {
          String temp = matcher_detail.group(i);
          matches.add(temp);
        }
      } else {
        matches = Collections.EMPTY_LIST;
      }      

      if (matches.size() > 0) {
        for(int i=0;i<matches.size();i++)
        {
          String pubTime = matches.get(i).toString().trim();
          //取出第一个值
          pubTime = pubTime.replace("/", "-").replace("年", "-").replace("月", "-").replace("日", "-");
          if(current.compareTo(TimeUtil.strToCalendar(pubTime, "yyyy-MM-dd"))>=0)
          {
            if(containsHMS)
              pubTime+=" "+"00:00:00";
            if(pubTime.matches(rightTimeReg))
            {
              return pubTime;
            }
          }
        }
      } else {
        return null;
      } 

    } catch (Exception e) {
      return null;
    }
    return null;
  }
}

以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。

(0)

相关推荐

  • java显示当前的系统时间

    编写Applet小程序,通过在HTML文档中接收参数,用不同颜色.字体显示当前的系统时间. Ex4_1.java import java.awt.*; import java.applet.Applet; import java.util.Calendar; public class Ex4_1 extends Applet { Calendar now; private String s1; private int size,color; public void init() { now=Ca

  • 学习Java中的日期和时间处理及Java日历小程序的编写

    Java 在 java.util 包中提供了 Date 类,这个类封装了当前的日期和时间. Date 类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date( ) 下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数 Date(long millisec) 一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间: SN 方法和描述 1 boolean after(Date date) 如果调用Date对象包含或晚于指定的日期则返回true,否则,返回

  • Java 时间转换的实例代码

    Java 时间转换的实例代码 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created by Edward on 2016/6/30. */ public class TimeUtil { /** * 将 1467341232351 转换为 指定格式 "yyyy-MM-dd HH:mm:ss.

  • Java8时间日期库中的常用使用示例

    有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之,只有任务本身才会真正促使你去探索及学习.java 8的新的日期及时间API也是一样.为了学习Java 8的这个新库,这里我创建了20个以任务为导向的例子.我们先从一个简单的任务开始,比如说如何用Java 8的时间日期库来表示今天,接着再进一步生成一个带时间及时区的完整日期,然后再研究下如何完成一些更实际的任务,比如说开发一个提醒类的应

  • java计算两个时间相差天数的方法汇总

    问题描述: 输入:两个日期 输出:两个日期相差的天数 具体代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 年份是分闰年和平年的,各自的天数不同 /** * date2比date1多的天数 * @param date1 * @param date2 * @return */ public static int differentDays(Date date1,Date date2) { Calendar cal

  • Java日期时间使用方法汇总

    一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中,操作日期主要涉及到一下几个类:  1.java.util.Date         类 Date 表示特定的瞬间,精确到毫秒.从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串.Date 中的把日期解释为年.月

  • java获取Date时间的各种方式汇总

    java获取Date时间的各种方式为大家分享如下 常用的时间获取方式 public class DateUtils { /** * 获取时间戳 * 输出结果:1438692801766 */ @Test public void getTimeStamp() { Date date = new Date(); long times = date.getTime(); System.out.println(times); //第二种方法: new Date().getTime(); } /** *

  • Java中Calendar时间操作常用方法详解

    本文实例为大家分享了Calendar时间操作常用方法,具体内容如下 package test; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Date和Calendar常用方法,Date很多方法已经弃用,因此以Calendar为主 * * @author tuzongxun123 * */ public class DateAndCalendarTest { p

  • Java精确抽取网页发布时间

    对网页中各种不同格式的发布时间进行抽取,将发布时间以规整的"yyyy-MM-dd HH:mm:ss"格式表示出来,只能尽量追求精确,但是因为网络发布时间的格式十分灵活,所以做不到百分百地正确抽取 package whu.extract.pubtime.core; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.List; impor

  • Java核心教程之常见时间日期的处理方法

    Java日期处理类Date详解 时间的基础知识 时区:整个地球分为二十四时区,每个时区都有自己的本地时间. 为了统一起见,使用一个统一的时间,称为全球标准时间(UTC,Universal Time Coordinated). TC与格林尼治平均时(GMT,Greenwich Mean Time,也翻译成:格林威治标准时间)差不多一样 CST(北京时间),北京时间,China standard Time,中国标准时间.在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8. 时间戳:自197

  • 浅谈java实现redis的发布订阅(简单易懂)

    redis的应用场景实在太多了,现在介绍一下它的几大特性之一   发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件:发布者(如服务器)可将订阅者感兴趣的事件随时通知

  • 基于python对B站收藏夹按照视频发布时间进行排序的问题

    前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难,因此就对收藏夹里面的视频进行了分类.但是分类之后紧接着又出现了一个新的问题:原来存放在默认收藏夹里面视频的相对顺序被打乱了--明明前几天刚收藏的视频却要翻很多很多页才能找到,因此有了这个程序. 程序的作用 因为我们看到的视频大部分都是通过推荐得到的,而推荐的视频大部分都是刚发布不久,因此大部分收藏的视频的顺序也基本是按照视频发布的顺序来的.那么通过程序

  • Java 8中日期和时间的处理方法

    Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了. java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,

  • java采用中文方式显示时间的方法

    本文实例讲述了java采用中文方式显示时间的方法.分享给大家供大家参考.具体如下: 其中t为秒,比如有时候需要计算两个任务相差多久,或者该任务何时结束或者某个任务间隔多久重新启动等适用于本方法.如果是微秒,自己先/1000 private static String chinese_period(int t){ int y, n, d, h, m, s; String time; if(t<=0) return "立即"; s = t % 60; t /= 60; m = t %

  • Java使用DateFormatter格式化日期时间的方法示例

    本文实例讲述了Java使用DateFormatter格式化日期时间的方法.分享给大家供大家参考,具体如下: Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; /** * Created by Fra

  • phpcms配置列表页以及获得文章发布时间

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <div class="moocConDetail"> {pc:content action="lists" catid="11" order="id DESC" num="10" moreinfo="1"} <ul> {loop $data $key $val} {php list($copyfrom) =

  • java实现oracle插入当前时间的方法

    本文实例讲述了java实现oracle插入当前时间的方法.分享给大家供大家参考.具体分析如下: 我在做一个inser操作的时候 要获取当前时间 存入数据库 就直接 ps.setDate(new java.util.Date()); 但是会报转换错误 此时应该 java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); ps.setDat

  • java抓取网页或文件中的邮箱号码

    本文实例为大家分享了java抓取邮箱号码的具体代码,供大家参考,具体内容如下 java抓取文件中邮箱号码的具体代码 package reg; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; impo

随机推荐