Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 请看我的问题,相信我这很容易解决_Javascript_Python_Node.js_Python 3.x_Python 2.7 - Fatal编程技术网

Javascript 请看我的问题,相信我这很容易解决

Javascript 请看我的问题,相信我这很容易解决,javascript,python,node.js,python-3.x,python-2.7,Javascript,Python,Node.js,Python 3.x,Python 2.7,我试图实现异步并在spawn子进程中等待。但它不起作用。请看这个 预期产量 ************* http://www.stevecostellolaw.com/ ************* http://www.stevecostellolaw.com/personal-injury.html http://www.stevecostellolaw.com/personal-injury.html ************* http://www.stevecostellolaw.

我试图实现异步并在spawn子进程中等待。但它不起作用。请看这个

预期产量

 *************
http://www.stevecostellolaw.com/
 *************
http://www.stevecostellolaw.com/personal-injury.html
http://www.stevecostellolaw.com/personal-injury.html
 *************
http://www.stevecostellolaw.com/#
http://www.stevecostellolaw.com/#
 *************
http://www.stevecostellolaw.com/home.html
http://www.stevecostellolaw.com/home.html
 *************
http://www.stevecostellolaw.com/about-us.html
http://www.stevecostellolaw.com/about-us.html
 *************
http://www.stevecostellolaw.com/
http://www.stevecostellolaw.com/

 *************
因为每次找到spawn child
wait
时,它都会返回python脚本并打印
************
然后打印URL。忽略此处相同url的2次打印

我得到的输出

C:\Users\ASUS\Desktop\searchermc>node app.js
server running on port 3000

DevTools listening on ws://127.0.0.1:52966/devtools/browser/933c20c7-e295-4d84-a4b8-eeb5888ecbbf
[3020:120:0402/105304.190:ERROR:device_event_log_impl.cc(214)] [10:53:04.188] USB: usb_device_handle_win.cc:1056 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[3020:120:0402/105304.190:ERROR:device_event_log_impl.cc(214)] [10:53:04.189] USB: usb_device_handle_win.cc:1056 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)

 *************
http://www.stevecostellolaw.com/
http://www.stevecostellolaw.com/personal-injury.html
http://www.stevecostellolaw.com/personal-injury.html
http://www.stevecostellolaw.com/#
http://www.stevecostellolaw.com/#
http://www.stevecostellolaw.com/home.html
http://www.stevecostellolaw.com/home.html
http://www.stevecostellolaw.com/about-us.html
http://www.stevecostellolaw.com/about-us.html
http://www.stevecostellolaw.com/
http://www.stevecostellolaw.com/

 *************

请参阅下面的
app.js
代码

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

    csvData = req.files.csvfile.data.toString('utf8');
    filteredArray = cleanArray(csvData.split(/\r?\n/))
    csvData = get_array_string(filteredArray)
    csvData = csvData.trim()
    
    var keywords = req.body.keywords
    keywords = keywords.trim()

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

    var outarr = []

    // process.stdout.on('data', (data) => {
    //   console.log(`stdout: ${data}`);
    // });

    process.stdout.on('data', async function(data){

      console.log("\n ************* ")
      console.log(data.toString().trim())
      await outarr.push(data.toString().trim())
      console.log("\n ************* ")

    });

});

Python函数,当if条件匹配时发送URL

# Function for searching keyword start
def search_keyword(href, search_key):
    extension_list = ['mp3', 'jpg', 'exe', 'jpeg', 'png', 'pdf', 'vcf']
    if(href.split('.')[-1] not in extension_list):
        try:    
            content = selenium_calling(href)
            soup = BeautifulSoup(content,'html.parser')
            search_string = re.sub("\s+"," ", soup.body.text)
            search_string = search_string.lower()
            res = [ele for ele in search_key if(ele.lower() in search_string)]
            outstr = getstring(res)
            outstr = outstr.lstrip(", ")
            if(len(res) > 0):
                print(href)
                found_results.append(href)
                href_key_dict[href] = outstr
                return 1
            else:
                notfound_results.append(href)
        except Exception as err:
            pass

我之所以想这么做,是因为python脚本需要更多的时间来执行,因此每次都会出现超时错误,所以我想在我的nodejs脚本中获得python脚本的中间输出。您可以在下图中看到我遇到的错误


我不确定自己是否完全理解您的意图,但我会试一试,因为您似乎已经多次问过这个问题(这通常不是一个好主意)。我认为你的问题不够清晰——如果你能澄清你的最终目标是什么(即,你希望它如何运作?),这会有很大帮助

我想你在这里提到了两个不同的问题。首先,您希望在从脚本返回的每个单独的数据之前放置一行新的“******”。这是一个不可依赖的问题-请查看此问题的答案以了解更多详细信息:。数据将以块的形式传递给stdout处理程序,而不是逐行传递,根据管道中当前的数据量,可以一次提供任意数量的数据

我最困惑的部分是您的措辞“在我的nodejs脚本中获得python脚本的中间输出”。不一定有任何“即时”数据——您不能依赖于进程的标准输出处理程序在任何特定时间输入的数据,它将以Python脚本本身及其运行的进程确定的速度向您提供数据。话虽如此,听起来你的主要问题是你的帖子超时了。你永远不会结束你的请求-这就是为什么你会得到一个超时。我将假设您希望在发送回响应之前等待第一个数据块(不管它包含多少行)。在这种情况下,您需要添加res.send,如下所示:

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

    csvData = req.files.csvfile.data.toString('utf8');
    filteredArray = cleanArray(csvData.split(/\r?\n/))
    csvData = get_array_string(filteredArray)
    csvData = csvData.trim()
    
    var keywords = req.body.keywords
    keywords = keywords.trim()

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

    var outarr = []

    // process.stdout.on('data', (data) => {
    //   console.log(`stdout: ${data}`);
    // });
    
    // Keep track of whether we've already ended the request
    let responseSent = false;

    process.stdout.on('data', async function(data){

        console.log("\n ************* ")
        console.log(data.toString().trim())
        outarr.push(data.toString().trim())
        console.log("\n ************* ")
        
        // If the request hasn't already been ended, send back the current output from the script
        // and end the request
        if (!responseSent) {
            responseSent = true;
            res.send(outarr);
        }
    });

});

wait outarr.push(data.toString().trim())
没有意义
Array.push()
不会返回承诺。5分钟。你等了5分钟才抱怨说还没有人自愿就跨两种不同语言的问题提供免费咨询建议???@ChrisG我希望所有返回的URL都在单独的数组索引中,请你能看到这一点,我挣扎了一个多星期,因为缺乏concept@Nickjones您永远不会在端点中结束请求。Node/express(我假设您在这里使用)在您告诉它之前不会结束请求,无论您的脚本是否完成。如果不想等待进程完成,请删除wait on outarr.push并添加return res.send(outarr)。但是,请记住,每次来自脚本的新数据都会调用数据处理程序,因此除非等待它完成,否则无法捕获完整的输出,显然。@Nickjones我认为没有人回答这些问题会给你带来麻烦,因为你试图做的事情的概念似乎没有真正意义。如果要捕获脚本的所有输出,脚本需要完成运行。如果不希望捕获输出(或者如果希望在脚本完成时结束请求),则需要使用res.end或res.send手动结束请求(如果有任何数据要发送回)。但同样,除非您让正在运行的脚本完成,否则您将无法获得任何保证数据。这是我的完整代码@Nickjones我不需要查看您的所有代码,我要求您解释代码的预期结果。您对异步代码、何时返回请求以及要使用什么数据做出了一些相互冲突的声明。你对我的答案有什么疑问吗,或者它回答了你的问题吗?我感谢你的努力让我检查一下我试图通过接收python的输出来解决超时问题,如果我的python脚本中的条件匹配,所以之前我将所有爬网数据存储在dataframe中,然后将dataframe重新调整到nodejs脚本,但我认为这会造成超时问题,因此,我开始考虑从python脚本到nodejs脚本获取匹配的url,然后将其保存在ndoejs脚本中声明的数组中。我的答案已从您在问题中发布的代码中删除。如果GitHub中的代码不同,则可能存在完全不同的问题。我不愿意研究一套全新的代码并为其编写新的答案。我强烈建议编辑您的问题以发布正确的代码,并且在将来不要发布您未使用的断开连接的代码。祝你好运