栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java精确抽取网页发布时间

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;
 

public class FetchPubTime {
  
  private static String url_reg_whole= "([-|/|_]{1}20\d{6})";
  
  private static String url_reg_sep_ymd = "([-|/|_]{1}20\d{2}[-|/|_]{1}\d{1,2}[-|/|_]{1}\d{1,2})";
  
  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])))))?$";
   
  
  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;
  }
   
  
  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;
  }
   
 
  
  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=0)
   {
     if(containsHMS)
pubTime+=" "+"00:00:00";
     if(pubTime.matches(rightTimeReg))
     {
return pubTime; 
     }
   }
 }
      } else { 
 return null; 
      } 

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/149893.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号