爬取项目中的中文

前沿

爬取项目中的中文核心思想在于通过脚本对项目文件进行遍历,通过文件名对文件进行筛选,读取筛选出的文件内容,查看文件内容中是否有符合的片段。

其实重点在于正则表达式的使用,如何巧妙的使用正则表达式来获取文件中复杂的中文内容。

Node

请安装node,下载项目后,执行node install安装相关依赖

项目源码地址:https://github.com/zhuyuzhu/getHanzi

执行命令爬取内容并生成Excel文件:node 脚本

查找HTML中的文字:

var fs = require("fs");
var path = require('path');
var xlsx = require('node-xlsx');
var regHtml = /\>((\s|\u3002|\uFF1F|\uFF01|\uFF0C|\u3001|\uFF1B|\uFF1A|\u300C|\u300D|\u300E|\u300F|\u2018|\u2019|\u201C|\u201D|\uFF08|\uFF09|\u3014|\u3015|\u3010|\u3011|\u2014|\u2026|\u2013|\uFF0E|\u300A|\u300B|\u3008|\u3009)*[\u4E00-\u9FA5]+(\s|\u3002|\uFF1F|\uFF01|\uFF0C|\u3001|\uFF1B|\uFF1A|\u300C|\u300D|\u300E|\u300F|\u2018|\u2019|\u201C|\u201D|\uFF08|\uFF09|\u3014|\u3015|\u3010|\u3011|\u2014|\u2026|\u2013|\uFF0E|\u300A|\u300B|\u3008|\u3009)*)+\</g; //匹配HTML中的中文片段

//中文符号的Unicode码
var ChineseSymbols = /(\s|\u3002|\uFF1F|\uFF01|\uFF0C|\u3001|\uFF1B|\uFF1A|\u300C|\u300D|\u300E|\u300F|\u2018|\u2019|\u201C|\u201D|\uFF08|\uFF09|\u3014|\u3015|\u3010|\u3011|\u2014|\u2026|\u2013|\uFF0E|\u300A|\u300B|\u3008|\u3009)/g

var hanziarr = [];
var filesHtmlNum = 0;

// 查找指定目录中的Html文件
function findDirHtmlSync(dirpath) {
    var filesNameArr = fs.readdirSync(dirpath);
    filesNameArr.forEach(fileName => {
        var fileordirpath = path.join(dirpath, fileName);
        var stats = fs.statSync(fileordirpath); //获取文件状态
        if (stats.isDirectory()) {
            findDirHtmlSync(fileordirpath)
        }
        if (stats.isFile() && fileordirpath.match(/\.html$/)) {
            filesHtmlNum++
            console.log(fileordirpath); //执行程序,控制台打印正在操作的文件
            readFileToArrSync(fileordirpath, "html")
        }
    })
}

/**
 * 读取文件内容,根据正则表达式,将需要的内容存入缓存数组中
 * @param {*} fReadName 文件名字(包含后缀)
 * @param {*} fileType 文件类型Html或js
 */
function readFileToArrSync(fReadName, fileType) {
    var filedata = fs.readFileSync(fReadName, "utf-8");
    var filehanziArr = null; //match方法匹配文件后的结果
    if(fileType === "html"){
        filehanziArr = filedata.match(regHtml);
    }
    if (filehanziArr) {
        hanziarr.push([null, null, null], [fReadName, null, null])
        filehanziArr.forEach(item => {
            hanziarr.push([null, null, item])
            
        })
    }
}

// 获取该地址文件夹中的所有html文件的中文
findDirHtmlSync('./project_demo');

console.log("The number of Html is "+ filesHtmlNum);

console.log(hanziarr);

var buffer = xlsx.build([{ name: "mySheetName", data: hanziarr }]); // Returns a buffer
fs.writeFileSync('./projecthtml.xlsx', buffer, "binary");

查找JS和JSP中的文字:

var fs = require("fs");
var path = require('path');
var xlsx = require('node-xlsx');

var reg = /[\u4E00-\u9FA5]+/g; //匹配中文片段

var regJsp = /\'\s*[\u4E00-\u9FA5]+\s*\'|\"\s*[\u4E00-\u9FA5]+\s*\"|\'.*[\u4E00-\u9FA5]+.*\'|\".*[\u4E00-\u9FA5]+.*\"|\/\/.+|\<\!\-\-.+\-\-\>|[\u4E00-\u9FA5]+/g; //也匹配注释部分

var regJs = /\'.*[\u4E00-\u9FA5]+.*\'|\".*[\u4E00-\u9FA5]+.*\"/g; //匹配引号内包含中文的片段

/**
 * 匹配js中的汉字,通过引号内包含汉字的方式去匹配
 * 还需要过滤min.js文件
 */

var hanziarr = [];
var filesJspNum = 0;
var filesJsNum = 0;

// 同步写法


// 查找指定目录中的jsp文件
function findDirJspSync(dirpath) {
    var filesNameArr = fs.readdirSync(dirpath);
    filesNameArr.forEach(fileName => {
        var fileordirpath = path.join(dirpath, fileName);
        var stats = fs.statSync(fileordirpath); //获取文件状态
        if (stats.isDirectory()) {
            findDirJspSync(fileordirpath)
        }
        if (stats.isFile() && fileordirpath.match(/\.jsp$/)) {
            filesJspNum++
            console.log(fileordirpath); //执行程序,控制台打印正在操作的文件
            readFileToArrSync(fileordirpath, "jsp")
        }
    })
}

/**
 * 读取文件内容,根据正则表达式,将需要的内容存入缓存数组中
 * @param {*} fReadName 文件名字(包含后缀)
 * @param {*} fileType 文件类型jsp或js
 */
function readFileToArrSync(fReadName, fileType) {
    var filedata = fs.readFileSync(fReadName, "utf-8");
    var filehanziArr = null; //match方法匹配文件后的结果
    if(fileType === "jsp"){
        filehanziArr = filedata.match(regJsp);
    }else if(fileType === "js"){
        filehanziArr = filedata.match(regJs);
    }
    if (filehanziArr) {
        hanziarr.push([null, null, null], [fReadName, null, null])
        filehanziArr.forEach(item => {
            if(fileType === "jsp" && (item.startsWith('//') || item.startsWith('<!--'))) {
                return;
            }
            hanziarr.push([null, null, item])
            
        })
    }
}

//查找指定目录中的js文件
function findDirJsSync(dirpath) {
    var filesNameArr = fs.readdirSync(dirpath);
    filesNameArr.forEach(fileName => {
        var fileordirpath = path.join(dirpath, fileName);
        var stats = fs.statSync(fileordirpath); //获取文件状态
        if (stats.isDirectory()) {
            findDirJsSync(fileordirpath)
        }
        // 此处对项目中的文件进行过滤,请结合实际项目进行过滤
        if (stats.isFile() && fileordirpath.match(/\.js$/) && (fileordirpath.match(/zh\_CN\.min\.js$/) || !fileordirpath.match(/min\.js$|searchIndexs\.js$|echarts-all\.js$/))) {
            filesJsNum++
            console.log(fileordirpath); //执行程序,控制台打印正在操作的文件
            readFileToArrSync(fileordirpath, "js")
        }
    })
}
// 获取该地址文件夹中的所有的jsp文件的中文
findDirJspSync('./movision-parent/movision-bmc-webapp/webapp');
// 获取该地址文件夹中的所有的js文件的中文
findDirJsSync('./movision-parent/movision-bmc-webapp/webapp');

console.log("The number of JSP is "+ filesJspNum);
console.log("The number of JS is "+ filesJsNum);

console.log(hanziarr);

var buffer = xlsx.build([{ name: "mySheetName", data: hanziarr }]); // Returns a buffer
fs.writeFileSync('./projectJspJs.xlsx', buffer, "binary");

特别注意正则表达式的使用

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值