Python - Bs4 usando PyExecJS
Canal Qb

import requests
from bs4 import BeautifulSoup
import execjs

# solicita a página da web
response = requests.get("https://www.example.com")

# analisa o DOM da página
soup = BeautifulSoup(response.content, 'html.parser')

# encontra todos os elementos <script> na página
scripts = soup.find_all('script')

# executa cada script usando PyExecJS
for script in scripts:
    execjs.eval(script.string)

# imprime o DOM da página
print(soup.prettify())

Este código faz basicamente a mesma coisa que o exemplo anterior, exceto que usa a biblioteca PyExecJS em vez de PyV8 para executar os scripts JavaScript. A biblioteca PyExecJS suporta várias engines JavaScript, incluindo o V8, Node.js e o JavaScriptCore (o engine JavaScript usado pelo Safari). Você não precisa especificar qual engine usar, pois o PyExecJS escolhe o melhor disponível automaticamente.

Erro: AttributeError: 'NoneType' object has no attribute 'strip'

Para evitar o erro, você pode verificar se o script tem conteúdo antes de executá-lo. Aqui está um exemplo atualizado que deve funcionar corretamente: 
import requests
from bs4 import BeautifulSoup
import execjs

# solicita a página da web
response = requests.get("https://www.example.com")

# analisa o DOM da página
soup = BeautifulSoup(response.content, 'html.parser')

# encontra todos os elementos <script> na página
scripts = soup.find_all('script')

# executa cada script usando PyExecJS
for script in scripts:
    # verifica se o script tem conteúdo de texto
    if script.string is not None:
        execjs.eval(script.string)

# imprime o DOM da página
print(soup.prettify())
Este código faz a mesma coisa que o exemplo anterior, mas verifica se o conteúdo do script é nulo antes de executá-lo usando o execjs.eval(). Se o conteúdo do script for nulo, o script é ignorado e a execução continua sem gerar um erro.

Erro:     raise ProgramError(value)
execjs._exceptions.ProgramError: SyntaxError: ')' esperado

O erro que você está recebendo pode ocorrer porque o código JavaScript que está sendo executado contém um erro de sintaxe.

Para corrigir esse erro, você pode verificar o código JavaScript para garantir que ele seja válido. Além disso, você pode usar a opção ignore_errors=True ao chamar execjs.eval() para ignorar quaisquer erros de sintaxe e continuar a execução do seu código Python. Isso pode ser útil se você não puder corrigir o erro de sintaxe no código JavaScript.

Aqui está um exemplo atualizado que usa a opção ignore_errors=True:
 
import requests
from bs4 import BeautifulSoup
import execjs

# solicita a página da web
response = requests.get("https://www.example.com")

# analisa o DOM da página
soup = BeautifulSoup(response.content, 'html.parser')

# encontra todos os elementos <script> na página
scripts = soup.find_all('script')

# executa cada script usando PyExecJS
for script in scripts:
    # verifica se o script tem conteúdo de texto
    if script.string is not None:
        try:
            execjs.eval(script.string)
        except execjs.ProgramError:
            # ignora erros de sintaxe no código JavaScript
            pass

# imprime o DOM da página
print(soup.prettify())
Este código faz a mesma coisa que os exemplos anteriores, mas usa a opção ignore_errors=True para ignorar quaisquer erros de sintaxe no código JavaScript que está sendo executado. Se ocorrer um erro de sintaxe, o código simplesmente continua sem gerar uma exceção.