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

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

编者注:我们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 16 天的内容。


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

image.png

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个字符。

image.png

我们将开发一个简单的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')

defindex():

   return render_template('index.html')

@app.route('/api/v1/extract')

defextract():

   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>

   <metaname="viewport"content="width=device-width, initial-scale=1.0">

   <linkrel="stylesheet"type="text/css"href="static/css/bootstrap.css">

   <styletype="text/css">

   body {

     padding-top:60px;

     padding-bottom: 60px;

   }

 </style>

</head>

<body>

<divclass="navbar navbar-inverse navbar-fixed-top">

     <divclass="container">

       <divclass="navbar-header">

         <buttontype="button"class="navbar-toggle"data-toggle="collapse"data-target=".navbar-collapse">

           <spanclass="icon-bar"></span>

           <spanclass="icon-bar"></span>

           <spanclass="icon-bar"></span>

         </button>

         <aclass="navbar-brand"href="#">TextExtraction</a>

       </div>

   </div>

 </div>

<divid="main"class="container">

   <formclass="form-horizontal"role="form"id="myform">

       <divclass="form-group">

           <divclass="col-lg-4">

               <inputtype="url"id="url"name="url"  class="form-control"placeholder="Url you want to parse"required>

           </div>

       </div>

       <divclass="form-group">

           <inputtype="submit"value="Extract"id="submitUrl"class="btn btn-success">

       </div>

   </form>

</div>

<divid="loading"style="display:none;"class="container">

   <imgsrc="/static/images/loader.gif"alt="Please wait.." />

</div>

<divid="result"class="container">

</div>

<scripttype="text/javascript"src="static/js/jquery.js"></script>

<scripttype="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调用。当我们接受到回应后,将它附加到resultdiv中。


部署到云端

在我们部署应用到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应用。

rhccreate-appday16demopython-2.7--from-codehttps://github.com/shekhargulati/day16-goose-extractor-demo.git--timeout180

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


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

相关文章
|
20天前
|
人工智能 运维 自然语言处理
|
9月前
|
人工智能 自然语言处理 小程序
蚂蚁百宝箱 3 分钟上手 MCP:6 步轻松构建 Qwen3 智能体应用并发布小程序
本文介绍如何用6个步骤、3分钟快速构建一个基于Qwen3与蚂蚁百宝箱MCP的智能体应用,并发布为支付宝小程序。通过结合Qwen3强大的语言理解和生成能力,以及支付宝MCP提供的支付功能,开发者可轻松打造具备商业价值的“数字员工”。案例以“全球智能导游助手”为例,支持119种语言,不仅提供旅行建议,还能收取用户打赏。文章详细说明了从登录百宝箱、创建应用、添加插件到配置角色、发布上架及手机端体验的完整流程,同时提醒当前支付功能仅适用于测试环境。适合希望探索AI应用变现潜力的开发者尝试。
1300 14
|
3月前
|
网络安全 Android开发 开发者
【实用软件】Escrcpy使用教程!功能强大的手机投屏电脑工具
Escrcpy是一款基于Electron的跨平台安卓投屏工具,支持USB、WiFi及IP连接,可实现低延迟屏幕镜像、鼠标操控、多设备管理与多屏协同,还具备录屏、文件传输、应用批量操作等实用功能。
1143 2
|
11月前
|
存储 分布式计算 运维
课时6:阿里云MaxCompute:轻松玩转大数据
阿里云MaxCompute是全新的大数据计算服务,提供快速、完全托管的PB级数据仓库解决方案。它拥有高效的压缩存储技术、强大的计算能力和丰富的用户接口,支持SQL查询、机器学习等高级分析。MaxCompute兼容多种计算模型,开箱即用,具备金融级安全性和灵活的数据授权功能,帮助企业节省成本并提升效率。
364 0
|
分布式计算 关系型数据库 MySQL
Sqoop【部署 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
【2月更文挑战第8天】Sqoop CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
747 1
|
缓存 安全 Linux
阿里云龙蜥系统,部署宝塔面板
linux系统web管理工具-宝塔面板
503 10
|
存储 安全 Java
如何接入OSS
如何接入OSS
|
XML 存储 数据格式
RAG效果优化:高质量文档解析详解
本文关于如何将非结构化数据(如PDF和Word文档)转换为结构化数据,以便于RAG(Retrieval-Augmented Generation)系统使用。
1370 11
|
JavaScript 数据安全/隐私保护 Python
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
1577 4