Webscraping application that collects metal prices and converts them from USD to MXN real-time using BeautifulSoup
Check for failure
metals = requests.get('https://www.lme.com/').text

should be
response = requests.get('https://www.lme.com/')
response.raise_for_status()
metals = response.text

String literals don't need parens
date = datetime.datetime.now()
time = (f'{date.day}/{date.month}/{date.year} | {date.hour}:{date.minute}')

would only need parens if it spans multiple lines.
Also, date shouldn't be called date for a couple of reasons:

it shadows datetime.date, and
it has a time, not just a date.

Finally: try using strftime rather than extracting the time's individual components to render a string.
No intermediate dict
metal_data = dict(zip(names, prices))
for k, v in metal_data.items():

The only reason you'd want to do this is if you're deeply concerned that there are duplicates, which this would remove. If there are no duplicates, then simply
for k, v in zip(names, prices):

Combine format strings
    v = (&quot;%.2f&quot; % v)
    k = metal_translation[k]
    print(f'{k}: {v} $')

can be
print(f'{metal_translation[k]}: {v:.2f}')