ro  fr  en  es  pt  ar  zh  hi  de  ru
ART 2.0 ART 3.0 ART 4.0 ART 5.0 ART 6.0 Pinterest

Пример кода Python, переводящего веб-сайт на другие языки, с помощью ключа DeepL + API а также BeautifulSoup

June 20, 2021, in Leadership and Attitude, by Neculai Fantanaru

 

Вы можете просмотреть полный код здесь:https://pastebin.com/KMduu6HV

Установить Python. Затем установите следующие две библиотеки с помощью интерпретатора командной строки (cmd) в Windows10:

py- m pip install pydeepl
py -m pip install beautifulsoup4

Python автоматически переведет следующие теги html с библиотекой DeepL:

<title>Your Text</title>
<meta name="description" content="Your Text"/>

Код Python также автоматически переведет содержимое следующих тегов (Ваш текст), но только если эти теги заключены в рамку <!-- ARTICOL START --> и <!-- ARTICOL START --> html комментарии.

<!-- ARTICOL START -->

<h1 class="den_articol" itemprop="name">Your Text</h1>
<p class="text_obisnuit">Your Text</p>
<p class="text_obisnuit2">Your Text</p>
<span class="text_obisnuit2">Your Text</span>
<span class="text_obisnuit">Your Text</span>
<li class="text_obisnuit">Your Text</li>
<a class="linkMare" href="https://neculaifantanaru.com/ru/">Your Text</a>
<h4 class="text_obisnuit2>Your Text</h4>
<h3 class="text_obisnuit2>Your Text</h3>
<h5 class="text_obisnuit2>Your Text</h5>

<!-- ARTICOL FINAL -->

КОД: Скопируйте и запустите приведенный ниже код в любой программе-интерпретаторе (я использую pyScripter) . Не забудьте изменить путь в "files_from_folder" линия. А вот список языков, на которые можно переводить: LANG. Зарегистрируйтесь на DeepL чтобы получить API Key.

from bs4 import BeautifulSoup
from bs4.formatter import HTMLFormatter
from googletrans import Translator
import requests
import json

if False:
    test = requests.post('https://api-free.deepl.com/v2/translate',
                    data={'auth_key':'PUT HERE YOUR API KEY:fx',
                          'text':'hello',
                          'source_lang':'EN',
                          'target_lang':'ZH'  #translates into Chinesse
                          }).content

    print(json.loads(test)['translations'][0]['text'])

translator = Translator()

class UnsortedAttributes(HTMLFormatter):
    def attributes(self, tag):
        for k, v in tag.attrs.items():
            yield k, v

files_from_folder = r"c:\test" #Change with your basic Path, for example a Folder with your website written in English
source_language = 'EN'  #translates from English

use_translate_folder = False

destination_language = 'ZH'  #translates into Chinesse

extension_file = ".html"

import os

directory = os.fsencode(files_from_folder)

def recursively_translate(node):
    for x in range(len(node.contents)):
        if isinstance(node.contents[x], str):
            if node.contents[x].strip() != '':
                try:
                    newtext = requests.post('https://api-free.deepl.com/v2/translate',
                    data={'auth_key':'PUT HERE YOUR API KEY:fx',
                          'text':node.contents[x],
                          'source_lang':source_language,
                          'target_lang':destination_language
                          }).content
                    node.contents[x].replaceWith(json.loads(newtext)['translations'][0]['text'])
                except:
                    pass
        elif node.contents[x] != None:
            recursively_translate(node.contents[x])
    
for file in os.listdir(directory):
    filename = os.fsdecode(file)
    print(filename)
    if filename == 'y_key_e479323ce281e459.html' or filename == 'TS_4fg4_tr78.html':
        continue
    if filename.endswith(extension_file): 
        with open(os.path.join(files_from_folder, filename), encoding='utf-8') as html:
            soup = BeautifulSoup('<pre>' + html.read() + '</pre>', 'html.parser')
            for title in soup.findAll('title'):
                recursively_translate(title)
                
            for meta in soup.findAll('meta', {'name':'description'}):
                try:
                    newtext = requests.post('https://api-free.deepl.com/v2/translate',
                    data={'auth_key':'PUT HERE YOUR API KEY:fx',
                          'text':meta['content'],
                          'source_lang':source_language,
                          'target_lang':destination_language
                          }).content
                    meta['content'] = json.loads(newtext)['translations'][0]['text']
                except:
                    pass

            for h1 in soup.findAll('h1', {'itemprop':'name'}, class_='den_articol'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(h1)) < end_comment:
                    recursively_translate(h1)

            for p in soup.findAll('p', class_='text_obisnuit'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(p)) < end_comment:
                    recursively_translate(p)
                
            for p in soup.findAll('p', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(p)) < end_comment:
                    recursively_translate(p)

            for span in soup.findAll('span', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(span)) < end_comment:
                    recursively_translate(span)

            for li in soup.findAll('li', class_='text_obisnuit'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(li)) < end_comment:
                    recursively_translate(li)

            for a in soup.findAll('a', class_='linkMare'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(a)) < end_comment:
                    recursively_translate(a)

            for h4 in soup.findAll('h4', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(h4)) < end_comment:
                    recursively_translate(h4)

            for h5 in soup.findAll('h5', class_='text_obisnuit2'):
                begin_comment = str(soup).index('<!-- ARTICOL START -->')
                end_comment = str(soup).index('<!-- ARTICOL FINAL -->')
                if begin_comment < str(soup).index(str(h5)) < end_comment:
                    recursively_translate(h5)

        print(f'{filename} translated')
        soup = soup.encode(formatter=UnsortedAttributes()).decode('utf-8')
        new_filename = f'{filename.split(".")[0]}_{destination_language}.html'
        if use_translate_folder:
            try:
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
            except:
                os.mkdir(files_from_folder+r'\translated')
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
        else:
            with open(os.path.join(files_from_folder, new_filename), 'w', encoding='utf-8') as html:
                html.write(soup[5:-6])

 

Это все, ребята.

Если вам нравится мой код, сделайте мне одолжение: переведите свой веб-сайт на румынский «ro».

Вы также можете увидеть это: BeautifulSoup Translate