编者注:我们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 16 天的内容。
今天的“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是因为:
我打算开发需要文章提取功能的应用。Goose Extractor基于NLTK和Beautiful Soup,分别是文本处理和HTML解析的领导者。
我想了解如何用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)
解释下上面的代码:
从
flask
包导入了Flask
类、request
对象、jsonify
函数和render_template
函数。从
goose
包导入Goose
类。定义了
/
和index
的路由。若用户向/
或/index
发送GET请求,会渲染index.html
页面。定义了
/api/v1/extract
路由。我们从请求对象中获取url
,然后创建了一个Goose类的实例。接着提取文章。最后创建一个json对象并返回该对象。json对象中包括标题、文本和主要图片。最后我们使用
python app.py
命令来启动开发服务器,以运行应用。我们把上面的代码复制到app.py文件中。我们同时通过Debug=True
开启了调试,这样当意料之外的情况出现时,浏览器就可以提供一个交互式的调试器。开启调试的另一个好处是,改动文件 之后,服务会自动重新加载。我们可以让调试器在后台运行,然后继续在我们的应用上工作。这提供了高效的开发环境。
我们将在index.html
中使用Twitter Bootstrap来添加样式。我们同时使用了jQuery,以便实现keyup
事件触发REST调用。退格、制表符、回车、上、下、左、右不会触发REST调用。
Extract Title, Text, and Image from URL
你可以从github 仓库中复制js和css文件。
上面的HTML文件中,表单提交触发REST调用。当我们接受到回应后,将它附加到result
div中。
部署到云端
在我们部署应用到OpenShift之前,我们需要先设置一下:
注册一个OpenShift账号。注册是完全免费的,Red Hat给每个用户三枚免费的Gear,可以用Gear运行你的应用。在写作此文的时候,每个用户能免费使用总共 1.5 GB 内存和 3 GB 硬盘空间。
安装 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使用 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/
好了,这就是今天的内容。请不断反馈。
原文 Day 16: Goose Extractor--An Article Extractor That Just Works
翻译 SegmentFault