网页正文提取方案

网页正文提取方案

闲暇时间无聊,研究了下如何获取网页正文的方案。这里说的网页正文主要是针对博客、新闻等文章类的网页进行获取,筛选出正文主题的内容。

关于方案

网上常用的方案有如下几种:
1. 根据解析dom结构,利用标签的特性来获取。比如titile,h1一般表示标题,p一般大多数在正文。去计算的时候可以去设置一些权重的方案,比方说div下包含p +1分,包含li减分等等。
2. 根据文字密度的来获取正文部分。这种方案是剔除html的tag标签,然后去计算文字密度,提取文字密度最高的部分。
3. 根据图像处理技术,来获取正文。


最开始,我采用了第2种方案,正确率有80%,但方案的缺点有如下
1. 有些网站正文只有一小段话,密度不高
2. 会丢失文章的排版、图片。

于是就启用了第一种方案,根据dom结构,算出正文最可能存在的div是哪一块。原先的思路是获取id或者class带有article属性的div,但是几乎每个网站的内容标签属性都不一致。后来根据多个网页的观察发现,现在大部分的网站正文部分都包含p标签,我们只需要找到包含最多p标签的那个最近的div就可以了。

内容获取的思路

获取dom中所有的p元素,向外找到其最近的div,计算命中最多次的div。
主要代码块如下:

     public String analysisContent(){
        // 寻找dom下所有的p元素
        Elements ps = dom.select("p");
        HashMap<Object, Integer> map = new HashMap<Object, Integer>();
        // 输出div
        Element mostDiv = null;
        int max = 0;
        // 遍历所有的p元素
        La: for (Element element : ps) {
            Element parent = element;
            boolean isFind = false;
            // p元素向外找3层div,如果有,放到map里
            for (int i = 0; i < 3; i++) {
                parent = parent.parent();
                if (i == 0 && parent.is("a,li")) {// a和li一般是类目元素,该p元素不要
                    continue La;
                }
                if (parent.is("div")) {
                    isFind = true;
                    break;
                }
            }
            if (!isFind) {
                continue;
            }
            if (map.get(parent) == null) {
                map.put(parent, 1);
            } else {
                map.put(parent, map.get(parent) + 1);
            }
            // 从map里获取命中最多次的div
            if (max < map.get(parent)) {
                max = map.get(parent);
                mostDiv = parent;
            }
        }
        return mostDiv.toString();
    }

这里的dom主要是用到了jsoup,这是一个类似jquery的dom解析框架。经过多个网站的测试,正确率可以达到90%。如果不需要dom中的一些image、object、video等元素,单独再对该div做相应的处理就可以了。

提取文章标题

标题一般都是h1元素,这里我们找到h1元素,就认为是文章的标题,如果找不到h1,就取title标签的内容

public String analysisTitle() {
        Elements eles = dom.select("h1");
        if (eles != null && eles.size() > 0) {
            return eles.eq(0).text();
        }

        eles = dom.select("title");
        if (eles != null && eles.size() > 0) {
            return eles.eq(0).text();
        }
        return null;
    }
获取文章发布时间

这里我是直接用正则匹配的方式获取年月日,暂时没有想到更好的方案,正则如下:
“\d{4}[-|/|\|年]\d{1,2}[-|/|\|月]\d{1,2}[日]?”

到这里,文章的大致内容就全部获取到了,随便解析一片文章试试水

标题:交通部:明天起,去坐长途大巴也要实名制购票
时间:2017-02-28
内容:<div class="post_text" id="endText" style="border-top:1px solid #ddd;"> 
 <p class="otitle"> (原标题:明天起,去坐长途大巴也要实名制购票了!) </p> 
 <p>新快报讯 记者许力夫报道 除了坐飞机和火车要实名制外,明天开始,坐长途大巴也要实行实名制了。《交通运输部关于修改〈道路旅客运输及客运站管理规定〉的决定》将于明天正式实施!道路客运实名制规定作为新《客规》的内容,市民到汽车客运站购买跨省、跨市的长途汽车票需提供身份证件,票面也将与火车票一样,印有本人身份信息,在进站上车时与本人身份证件核对信息。对拒不提供本人有效身份证件原件或者票、人、证不一致的将不被允许乘车。</p>
 <p><b>实名制后如何购票坐车?</b></p>
 <p>对于经常要到汽车客运站乘坐长途客车的朋友们,实名制其实也不是很复杂,因为现在外出都是要带上身份证件的了。</p>
 <p>根据新规,购票时由购票人提供旅客的有效身份证件原件并由售票人在客票上记载旅客的身份信息;携带免票儿童的,应当凭免票儿童的有效身份证件同时免费申领实名制车票。通过网络、电话等方式实名购票的,购票人应当提供真实准确的旅客有效身份证件信息,并在取票时提供旅客的有效身份证件原件。帮别人购票的也需出示代购人和被代购人的身份证件。旅客进站应当出示有效客票和本人有效身份证件原件,配合工作人员查验,对拒不提供本人有效身份证件原件或者票、人、证不一致的不得乘车。</p>
 <p>根据新的规定,广大旅客在购票乘车时务必携带、出示有效身份证明等有效证件,一个有效证件购买一张车票(人、证、票需一致)。通过网络、电话等途径购票的旅客请携带身份证件以备查验。同时,在办理改签、退票等手续时,旅客需凭购票时的有效证件原件办理。</p>
 <p><b>哪些证件可以购票乘车?</b></p>
 <p>有效证件包括:居民身份证、临时身份证、户口簿、机动车驾驶证、军官证、武警警官证、士兵证、军队学员证、军队文职干部证、军队离退休干部证、军队职工证、退伍证、护照、港澳居民来往内地通行证、中华人民共和国往来港澳通行证、台湾居民来往大陆通行证、大陆居民往来台湾通行证、外国人居留证、外国人出入境证、外交官证、领事馆证、海员证、外交部开具的外国人身份证明、地方公安机关出入境管理部门开具的护照报失证明等24种。也就是说忘记带身份证的话也可以用别的有效证件购票。无法提供有效证件的需要到车站所属派出所开具身份证明。</p>
 <p><b>儿童没有身份证怎么办?</b></p>
 <p>需要提供身份证的人群:成人、1.2米至1.5米的半票儿童、1.2米以下的免票儿童(含婴儿),即只要乘车的旅客均要出示本人有效身份证件购票。对成人来说,带着身份证件外出已经习以为常。但对儿童来说,带上身份证件的情况还不是很普遍。儿童没有身份证怎么办呢?记者从汽车客运站方面了解到,没有身份证需提供户口簿、出生证明等有效证明。为了出行方便,家长可以为儿童办理身份证,未满十六周岁的公民可自愿申领居民身份证。</p>
 <p>需要特别注意的是,与以往免票儿童可以直接上车的情况不同,新规中规定:携带免票儿童的,应当凭免票儿童的有效身份证件,免费申领实名制客票。也就是要在成人买票时一并申领免费儿童票。</p>
 <p><b>■温馨提醒</b></p>
 <p><b>遗失车票可免费补票</b></p>
 <p>实名制管理后,还有一个好处就是,旅客再也不怕再遗失车票了。因为新规中还规定了:旅客遗失客票的,经核实其身份信息后,售票人应当免费为其补办客票。</p>
 <br>
 <!-- AD200x300_2 --> 
 <div class="gg200x300"> 
  <div style="position:relative;"> 
   <a href="http://gb.corp.163.com/gb/legal.html" class="ad_hover_href"></a> 
   <iframe src="http://g.163.com/r?site=netease&amp;affiliate=news&amp;cat=article&amp;type=logo300x250&amp;location=12" width="300" height="250" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"> </iframe> 
  </div> 
 </div>
 <p></p>
 <pre datatype="specialtag" datavalue="推荐" style="white-space:pre-wrap;display: block;border: 3px solid blue;" title="推荐"><p><a href="http://news.163.com/17/0124/01/CBGRQ23D00018AOP.html" target="_self" style="line-height: 1;">西安火车站"黑票点":自制白条车票非法营运跑长途</a></p><p>车票,既是乘客乘车的凭证,更是乘客维权的保证。然而,一些黑票点仅出具一张自制车票,就能让乘客乘坐非营运大巴车。面对检查,他们如何逃避?非营运车或手续不全的车辆又是如何将自己“洗白”,并堂而皇之地“营运”。近半个月来,记者在西安火车站广场及其附近进行了暗访。</p></pre> 
 <p></p> 
 <div class="ep-source cDGray"> 
  <span class="left"><a href="http://news.163.com/"><img src="http://img1.cache.netease.com/cnews/css13/img/end_news.png" alt="胡淑丽" width="13" height="12" class="icon"></a> 本文来源:金羊网-新快报 </span> 
  <!--杨强_NN6027-->
  <span class="ep-editor">责任编辑:杨强_NN6027</span> 
 </div> 
</div>
解析时间:236
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值