前端小白的python實戰: 報紙分詞排序

先看效果:html

圖片描述

環境

  • win7 64位
  • python 3.5

目標

抓取一篇報紙,並提取出關鍵字,而後按照出現次數排序,用echarts在頁面上顯示出來。node

工具選擇

由於以前對nodejs的相關工具比較熟悉,在用python的時候,也想有相似的工具。因此就作了一個對比的表格。python

功能 nodejs版 python版
http工具 request requests
中文分詞工具 node-segment, nodejieba(一直沒有安裝成功過) jieba(分詞準確度比node-segment好)
DOM解析工具 cheeio pyquery(這兩個工具都是有相似jQuery那種選擇DOM的接口,很方便)
函數編程工具 underscore.js underscore.py(underscore來處理集合比較方便)
服務器 express flask

開始的噩夢:中文亂碼

感受每一個學python的人都遇到過中文亂碼的問題。我也不例外。jquery

首先要抓取網頁,可是網頁在控制檯輸出的時候,中文老是亂碼。搞了很久,搞得我差點要放棄python。最終找到解決方法。 解決python3 UnicodeEncodeError: 'gbk' codec can't encode character 'xXX' in position XXgit

過程很艱辛,可是從中也學到不少知識。github

import io
import sys
sys.stdout = io.TextIOWrapper(sys.stoodout.buffer,encoding='gb18030')

函數式編程: 順享絲滑

#filename word_rank.py
import requests
import io
import re
import sys
import jieba as _jieba # 中文分詞比較優秀的一個庫
from pyquery import PyQuery as pq #相似於jquery、cheerio的庫
from underscore import _ # underscore.js python版本
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') # 解決控制檯中文亂碼

USELESSWORDS = ['的','要','了','在','和','是','把','向','上','爲','等','個'] # 標記一些無用的單詞
TOP = 30 # 只要前面的30個就能夠了

def _remove_punctuation(line): # 移除非中文字符
    # rule = re.compile("[^a-zA-Z0-9\u4e00-\u9fa5]")
    rule = re.compile("[^\u4e00-\u9fa5]")
    line = rule.sub('',line)
    return line

def _calculate_frequency(words): # 計算分詞出現的次數
    result = {}
    res = []

    for word in words:
        if result.get(word, -1) == -1:
            result[word] = 1
        else:
            result[word] += 1

    for word in result:
        if _.contains(USELESSWORDS, word): # 排除無用的分詞
            continue

        res.append({
                'word': word,
                'fre': result[word]
            })

    return _.sortBy(res, 'fre')[::-1][:TOP] # 降序排列

def _get_page(url): # 獲取頁面
    return requests.get(url)

def _get_text(req): # 獲取文章部分
    return pq(req.content)('#ozoom').text()

def main(url): # 入口函數,函數組合
    return _.compose(
        _get_page,
        _get_text,
        _remove_punctuation,
        _jieba.cut,
        _calculate_frequency
        )(url)

python服務端:Flask淺入淺出

import word_rank
from flask import Flask, request, jsonify, render_template
app = Flask(__name__)
app.debug = True

@app.route('/rank') # 從query參數裏獲取pageUrl,並給分詞排序
def getRank():
    pageUrl = request.args.get('pageUrl')
    app.logger.debug(pageUrl)

    rank = word_rank.main(pageUrl)
    app.logger.debug(rank)
    return jsonify(rank)

@app.route('/') # 主頁面
def getHome():
    return render_template('home.html')

if __name__ == '__main__':
    app.run()

總結

聽說有個定律:凡是能用JavaScript寫出來的,最終都會用JavaScript寫出來。 我是很但願這樣啦。可是不得不認可,python上有不少很是優秀的庫。
這些庫在npm上並無找到合適的替代品。express

因此,我就想: 如何能用nodejs直接調用python的第三方庫npm

目前的解決方案有兩種,第一,只用nodejs的child_processes。這個方案我試過,可是不太好用。編程

第二,npm裏面有一些包,能夠直接調用python的庫。例如:node-python, python.js, 可是這些包我在win7上安裝的時候老是報錯。並且解決方法也蠻麻煩的。索性我就直接用python了。json

最後附上項目地址:https://github.com/wangduandu...

相關文章
相關標籤/搜索