首页 > 解决方案 > 在从python获得的nodejs中打印csv字符串

问题描述

我请求所有有 NodeJS/python 经验的玩家看看我的问题。请至少将我引导到可以解决此问题的路径。

我在后端的 python 脚本./webextraction.py处理 nodejs ( app.js) 从客户端发送的 3 个参数(urls csv 文件或字符串、关键字和布尔复选框)。但问题是python脚本正在使用webdriver.Chrome它首先在命令提示符下写一些如下所示的指令

图片1

此外,在我的 nodejs 脚本中,我成功地将上述系统参数发送到 python 脚本,并在 url 中获得了输出localhost:4000/formsubmit,但问题是它只打印命令提示符的第一行,

例如,见下文

网页

但是我构建代码来查看处理后的 csv 字符串而不是这个[WDM] - ====== WebDriver manager ======

请在下面查看我的 nodejs 代码文件app.js,并请指导我

/* csv to json */
const express = require("express"),
  app = express(),
  upload = require("express-fileupload"),
  csvtojson = require("csvtojson");

var http = require('http');
var path = require("path");
var bodyParser = require('body-parser');
var helmet = require('helmet');
var rateLimit = require("express-rate-limit");

let csvData = "test";
app.use(upload());

var server = http.createServer(app);

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100 // limit each IP to 100 requests per windowMs
});

app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname,'./Final')));
app.use(helmet());
app.use(limiter);

server.listen(process.env.PORT || 3000, function() { 
    console.log('server running on port 3000'); 
})

app.get('/', function(req, res){
    res.sendFile(path.join(__dirname,'./index.html'));
});

// form submit request
app.post('/formsubmit', function(req, res){

    /** convert req buffer into csv string , 
    *   "csvfile" is the name of my file given at name attribute in input tag */
    csvData = req.files.csvfile.data.toString('utf8');

    // Send request to python script
    var spawn = require('child_process').spawn;
    var process = spawn('python', ["./webextraction.py", csvData, req.body.keywords, req.body.full_search])

    dataString = "";

    process.stdout.on('data', function(data){
    dataString += data.toString();
    });

    process.stdout.on('end', function(){
    console.log(dataString);
    });
    
    process.stdin.end();

    process.stderr.on('data', function(data){
        res.send("<p>"+data.toString()+"</p>");
    });

});

我尝试了下面的代码,它以块的形式接收数据,但仍然无法正常工作

    process.stdout.on('data', chunk => chunks.push(chunk));

    process.stdout.on('end', () => {

        try {
            // If JSON handle the data
            const data = JSON.parse(Buffer.concat(chunks).toString());

            console.log(data);

        } catch (e) {
            // Handle the error
            console.log(result);
        }
    });

下面是./webextraction.py使用数据框创建 csv 文件的 python 代码文件的一部分。此 python 代码具有 csv 字符串。请注意输入 csv 和输出 csv 文件可以有更多的行数,即 1000s

    colList = ['Found urls', 'Not found urls','Error urls']
    dframe = pd.DataFrame(columns = colList, dtype = str)

    maxlen = get_max_of_list(found_results_A, found_keywords_list_changed, notfound_results, error_urls)

    found_results_A = append_space(found_results_A, maxlen)
    notfound_results = append_space(notfound_results, maxlen)
    error_urls = append_space(error_urls, maxlen)
    found_keywords_list_changed = append_space(found_keywords_list_changed, maxlen)

    if(len(found_results_A) == maxlen and len(notfound_results) == maxlen and len(error_urls) == maxlen and len(found_keywords_list_changed) == maxlen):    
        dframe['Found urls'] = found_results_A
        dframe['keywords'] = found_keywords_list_changed
        dframe['Not found urls'] = notfound_results
        dframe['Error urls'] = error_urls

    dframe = dframe.sort_values(by=["Found urls"], ascending=False)
    data = dframe.dropna(axis=0, how='all', thresh=None, subset=None, inplace=False)
    export_csv = dframe.to_csv(encoding = 'ASCII', index = None, header = True)
    print(export_csv)

下面的文件代码是index.html将内容发送到nodejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Keyword searcher</title>
</head>
<body>
    <div class="row">
        <div class="col">
            
            <form method="post" enctype="multipart/form-data" action="/formsubmit">
                <label for="csvfile">Upload csv file (having URLs)</label><br>
                <input type="file" name="csvfile" id="csvfile" accept=".csv"><br>
                <p>Enter keywords to search (separated by comma(,))</p>
                <input type="text" name="keywords" id="keywords"><br>
                <label for="full_search">Full search</label>
                <input type="checkbox" name="full_search" id="full_search"><br>
                <button type="submit">Submit</button>
            </form>

            <div id="status"></div>

        </div>
    </div>    
</body>
</html>

标签: pythonnode.jspandascsv

解决方案


推荐阅读