返回介绍

Day 16: Goose Extractor - 好用的文章提取工具

发布于 2025-01-31 20:47:30 字数 8186 浏览 0 评论 0 收藏 0

今天的 “30 天学习 30 种新技术” 的主题是如何使用 Python 进行 文章提取 。这几个月来,我对文章提取很感兴趣,因为我想写一个 Prismatic 克隆。Prismatic 创建基于用户兴趣的新闻源。提取文章的主要内容、图片和其他元信息对大多数类似 Prismatic 的内容发现站点很有用。本文中,我们将学习如何使用 Python 的 goose-extractor 包来完成这个任务。我们首先介绍一些基础知识,然后使用 Goose Extractor 的 API 来开发一个简单的 Flask 应用。

Goose Extractor 是什么?

Goose Extractor 是一个 Python 的开源文章提取库。可以用它提取文章的文本内容、图片、视频、元信息和标签。 Goose 本来是由 Gravity.com 编写的 Java 库,最近转向了 scala。

Goose Extractor 网站是这么介绍的:

Goose Extractor 完全用 Python 重写了。目标是给定任意资讯文章或者任意文章类的网页,不仅提取出文章的主体,同时提取出所有元信息以及图片等信息。

为什么关心 Goose Extractor

我决定学习 Goose Extractor 是因为:

  1. 我打算开发需要文章提取功能的应用。Goose Extractor 基于 NLTKBeautiful Soup ,分别是文本处理和 HTML 解析的领导者。
  2. 我想了解如何用 Python 进行文章提取。

安装 Goose Extractor

我们首先需要安装 Python 和 virtualenv,本文使用的 Python 版本是 2.7

然后使用如下命令安装:

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

GitHub 仓库

今天的示例程序的代码可从 GitHub 取得。

应用

示例应用运行在 OpenShift 上 http://gooseextractor-t20.rhcloud.com/ 用户可以提交链接,应用会显示标题,主要图片和正文的前 200 个字符。

我们将开发一个简单的 REST API Flask 应用。如果你不了解 Flask,你可以看 这篇我以前写的文章

安装 Flask:

. venv/bin/activate
pip install flask

myapp 目录下创建 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)

解释下上面的代码:

  1. flask 包导入了 Flask 类、 request 对象、 jsonify 函数和 render_template 函数。
  2. goose 包导入 Goose 类。
  3. 定义了 /index 的路由。若用户向 //index 发送 GET 请求,会渲染 index.html 页面。
  4. 定义了 /api/v1/extract 路由。我们从请求对象中获取 url ,然后创建了一个 Goose 类的实例。接着提取文章。最后创建一个 json 对象并返回该对象。json 对象中包括标题、文本和主要图片。
  5. 最后我们使用 python app.py 命令来启动开发服务器,以运行应用。我们把上面的代码复制到 app.py 文件中。我们同时通过 Debug=True 开启了调试,这样当意料之外的情况出现时,浏览器就可以提供一个交互式的调试器。开启调试的另一个好处是,改动文件 之后,服务会自动重新加载。我们可以让调试器在后台运行,然后继续在我们的应用上工作。这提供了高效的开发环境。

我们将在 index.html 中使用 Twitter Bootstrap 来添加样式。我们同时使用了 jQuery,以便实现 keyup 事件触发 REST 调用。退格、制表符、回车、上、下、左、右不会触发 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>

你可以从 github 仓库 中复制 js 和 css 文件。

上面的 HTML 文件中,表单提交触发 REST 调用。当我们接受到回应后,将它附加到 result div 中。

部署到云端

在我们部署应用到 OpenShift 之前,我们需要先设置一下:

  1. 注册一个 OpenShift 账号 。注册是完全免费的,Red Hat 给每个用户三枚免费的 Gear,可以用 Gear 运行你的应用。在写作此文的时候,每个用户能免费使用总共 1.5 GB 内存和 3 GB 硬盘空间。
  2. 安装 rhc 客户端工具rhc 是 ruby gem,因此你的机子上需要装有 ruby 1.8.7 以上版本。 只需输入 sudo gem install rhc 即可安装 rhc 。如果你已经安装过了,确保是最新版。运行 sudo gem update rhc 即可升级。关于配置 rhc 命令行工具的详细信息,请参考: https://openshift.redhat.com/community/developers/rhc-client-tools-install
  3. 使用 rhc 的 setup 命令配置你的 OpenShift 账号。这个命令会帮助你创建一个命名空间,同时将你的 ssh 公钥上传至 OpenShift 服务器。

设置之后,我们可以通过如下命令创建一个新的 OpenShift 应用。

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

这会为我们创建一个名为 gear 的应用容器,并自动配置相应的 SELinux 政策和 cgroup 设置。OpenShift 同时会为我们创建一个私有的 git 仓库,并将其克隆到本地。最后,OpenShift 会自动配置 DNS。应用可以在如下地址访问 http://gooseextractor-t20.rhcloud.com/

好了,这就是今天的内容。请不断反馈。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文