zoukankan      html  css  js  c++  java
  • [译] 第十六天: Goose Extractor

    前言

    今天的30天挑战,我决定学习怎样用Python实现文章提取,几个月前当我想写Prismatic克隆的时候就对文章提取有兴趣了。Prismatic会根据用户的兴趣创建新闻feed. 提取出文章的主要内容,图片和其他元信息在大部分像Prismatic这样的内容挖掘网站是一个很基本的需求。这篇博客里,我们来学习用goose-extractor Python包来完成这个任务,先学习些基础知识,再用Goose Extractor API开发个简单的Flask程序.

    Goose Extractor是什么?

    Goose Extractor是一个开源的文章提取库,用Python编写,可以用来提取文章的主要文字,图片,视频,数据描述和数据标签。Goose最开始由Gravity.comJava编写,最近转换成了scala项目。 

    摘自Goose Extractor网站 

    Goose Extractor完全由python重写,软件旨在给出文章或者文章类型的网页的任何新闻,不仅仅是文章的主要内容,还包括所有的元数据和最可能的重要图片。 

    我为什么关注Goose Extractor?

    我决定学习Goose Extractor的几点原因:

    1. 我想开发的程序需要用到文章提取。Goose Extractor基于强悍的NTLKBeautiful Soup, 他们是文字处理和HTML分析中成熟前沿的库。
    1. 我想学习怎样用Python完成文章提取。 

    安装Goose Extractor

    在开始用Goose Extractor前,我们需要先装Pythonvirtualenv, 我这里用的Python版本是2.7. 

    我们用pip install来开始Goose Extractor给不熟悉pip的开发者提一下,它是Python包管理器,我们可以从官网下载pip, 在你机器上选个目录,运行一下命令。

    $ mkdir myapp
    $ cd myapp
    $ virtualenv venv --python=python2.7
    $ . venv/bin/activate
    
    $ pip install goose-extractor
    View Code

    以上命令会在本地上创建myapp目录,然后用Python激活irtualenv, 再安装goose-extractor包。 

    Github仓库

    今天的demogithub: day16-goose-extractor-demo. 

    程序

    demoOpenShift上的地址http://gooseextractor-t20.rhcloud.com/. 是用Goose Extractor API写的很简单的示例,用户可以提交链接,然后程序会现在标题,主要图像和文章主题的前200字。

    我们开发个简单的Flask程序用于解析REST API, 如果你对Flask不熟悉,参考我之前的博客 

    接下来要安装Flask框架,要安装Flask, 先激活virtualenv然后用pip安装Flask.

    $ . venv/bin/activate
    $ pip install flask

    如我之前博客Flask里提到的,它对于写基于web服务的REST非常棒,在myapp文件夹下新建文件app.py.

    $ touch app.py

    复制以下代码粘贴到app.py文件。

    from flask import Flask, request, render_template,jsonify
    from goose import Goose
     
    app = Flask(__name__)
     
    @app.route('/')
    @app.route('/index')
    def index():
        return render_template('index.html')
     
    @app.route('/api/v1/extract')
    def extract():
        url = request.args.get('url')
        g = Goose()
        article = g.extract(url=url)
        response = {'title' : article.title , 'text' : article.cleaned_text[:250],'image': article.top_image.src}
        return jsonify(response)
     
    if __name__ == "__main__":
        app.run(debug=True)
    View Code

    以上代码:

    1. flask包导入Flask 类,request对象,jsonify方法和render_template方法
    1. goose包导入Goose
    2. 定义路径'/' 'index' url, 所以,当用户发送GET请求到'/'或者'/index', index.html就会被加载
    3. 定义路径'api/v1/extract' url, 我们先从request对象获得'url'查询参数,然后创建Goose类的实例,接着,提取文章,最后,创建json对象并返回。这个json对象包含了标题,纯文本和文章的主要图片。
    4. 最后,我们用python app.py命令来启动服务,运行程序。通过设置Debug=True启动调试。调试模式下,如果出现未知错误,可以在浏览器里交互调试。调试模式的另外一个好处是它可以自动加载更新。我们可以在后台环境开启调试,并保持应用继续工作。这就提供了一个很好的生产环境。 

    Index()方法加载html文件,在myapp目录下新建templates文件夹,然后新建文件index.html.

    $ mkdir templates
    $ touch templates/index.html

    复制内容到index.html,用Twitter Boostrap添加格式,用jQuery使REST调用keyup事件。当键是backspace, tab, enter, left, right, up, down时不使用REST.

    <!DOCTYPE html>
    <html>
    <head>
        <title>Extract Title, Text, and Image from URL</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" type="text/css" href="static/css/bootstrap.css">
        <style type="text/css">
        body {
          padding-top:60px;
          padding-bottom: 60px;
        }
      </style>
    </head>
    <body>
     
    <div class="navbar navbar-inverse navbar-fixed-top">
          <div class="container">
            <div class="navbar-header">
              <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
              </button>
              <a class="navbar-brand" href="#">TextExtraction</a>
            </div>
     
        </div>
      </div>
     
    <div id="main" class="container">
        <form class="form-horizontal" role="form" id="myform">
            <div class="form-group">
                <div class="col-lg-4">
                    <input type="url" id="url" name="url"  class="form-control" placeholder="Url you want to parse" required>
                </div>
            </div>
            <div class="form-group">
                <input type="submit" value="Extract" id="submitUrl" class="btn btn-success">
            </div>
        </form>
    </div>
     
    <div id="loading" style="display:none;" class="container">
        <img src="/static/images/loader.gif" alt="Please wait.." />
    </div>
     
    <div id="result" class="container">
     
    </div>
     
    <script type="text/javascript" src="static/js/jquery.js"></script>
    <script type="text/javascript">
        $("#myform").on("submit", function(event){
            $("#result").empty();
            event.preventDefault();
            $('#loading').show();
            var url = $("#url").val()
            $.get('/api/v1/extract?url='+url,function(result){
                $('#loading').hide(); 
                $("#result").append("<h4>"+result.title+"</h4>");
                $("#result").append("<img src='"+result.image+"' height='300' width='300'</img>");
                $("#result").append("<p class='lead'>"+result.text+"</p>");
        })
     
     
        });
     
    </script>
    </body>
    </html>
    View Code

    你可以从我的github仓库复制jscss文件。 

    以上HTML文件,我们在提交表格上使用了REST调用,接收到响应后,追加在结果div后。

    发布到云

    在发布之前,先准备几步。

    1. OpenShift Account上注册。 OpenShift完全免费,红帽给每个用户免费提供了3个Gears来运行程序。目前,这个资源分配合计有每人1.5GB内存,3GB磁盘空间。
    2. 在本机安装rhc 客户端工具,rhc是ruby gem包,所以你需要安装1.8.7或以上版本的ruby。安装rhc,输入 sudo gem install rhc. 如果已经安装了,确保是最新的,要更新rhc,输入sudo gem update rhc. 想了解rhc command-line 工具,更多帮助参考https://www.openshift.com/developers/rhc-client-tools-install.
    1. 用rhc 安装命令安装OpenShift. 执行命令可以帮你创建空间,上传ssh 密钥到OpenShift服务器。 

    安装之后,我们可以运行以下命令来创建程序。 

    $ rhc create-app day16demo python-2.7 --from-code https://github.com/shekhargulati/day16-goose-extractor-demo.git --timeout 180

    它会执行所有从创建程序,到设置公共DNS, 到创建git私有仓库,最后用Github仓库的代码发布应用。程序运行在http://day16demo-{domain-name}.rhcloud.com. 替换你自己的域名。这个程序运行在http://gooseextractor-t20.rhcloud.com/. 

    这就是今天的内容,继续给反馈吧。 

    原文:https://www.openshift.com/blogs/day-16-goose-extractor-an-article-extractor-that-just-works

  • 相关阅读:
    Activex、OLE、COM、OCX、DLL之间有什么区别?
    如何通过VC的 CHttpFile 抓取网页内容
    RPC远程过程调用实例详解(转)
    C++中extern “C”含义深层探索
    Android NDK Development ---- Android 4.4
    Android NDK Overview ---- Android 4.4
    Android NDK How-To ---- Android 4.4
    使用Jquery+EasyUI框架开发项目+下载+帮助--EasyUI的简介
    zzzzw_在线考试系统③完结篇
    一个月的时间--java从一无所有到能用框架做点东西出来
  • 原文地址:https://www.cnblogs.com/endless-on/p/3500077.html
Copyright © 2011-2022 走看看