Нет ответа от URL, использующего запросы Python для другого языка

Я хотел использовать сервис Google Translate для преобразования текста с одного языка на другой. Я знаю, что Google Translate теперь является платным сервисом, поэтому я не использовал REST API. Я попробовал следующий способ, чтобы выучить язык и больше ничего.

Код работает хорошо, когда я запрашиваю URL для перевода на язык, который возвращает текст на английском языке. Например, если вы звоните:-

do_trans("Hello World", "fr", "en")

Пример вывода

Бонжур Ле Монд

Привет, мир

Выше работает хорошо. Работая хорошо, я имею в виду, что когда я повторяю запрос на получение текста на английском языке из текста на французском языке, то полученный вывод является правильным. Но если я запрашиваю такой язык, как японский или китайский (который возвращает разные данные в Юникоде) и т. Д., То перевод с китайского или японского на английский не выполняется, хотя первая часть, которая является английской для других языков, работает хорошо.


# -- coding: utf-8 --

import requests
import re

__base_url = "http://translate.google.com/translate_a/t"
__headers = {
    "User-Agent": "Mozilla/5.0 (Windows; U; en) AppleWebKit/420+ (KHTML, like Gecko) "
                  "Version/3.1.2 Safari/525.21"
}
params = {
    "client": "t",
    "ie": "UTF-8",
    "oe": "UTF-8",
    "sl": "en",
    "tl": "ja",
    "text": "こんにちはモンキー!"
}
matcher = re.compile(r'\[\[\["(.*?)","(.*)","(.*)",""\]\]')


def do_trans(text, tolang, fromlang):
    params['sl'] = fromlang
    params['tl'] = tolang
    params['text'] = text

    req = requests.get(__base_url, params=params, headers=__headers)
    if req.status_code == 200:
        transtext = re.search(matcher, req.text)
        if transtext:
            return transtext.group(1)

if __name__ == "__main__":
    t1 = do_trans("Hello World", "zh-CN", "en")
    print(t1)
    t2 = do_trans(t1, "en", "zh-CN")
    print t2

Пример вывода для выше:-

你好 世界

Никто

Любая помощь и информация о том, как решить эту ошибку или проблему, были бы хорошими.

Спасибо.

1 ответ

Решение

Что ж, проблема в выражении соответствия, вы видите, что если вы напечатаете req.text, вы заметите, что при переводе с en на zh-CN вы получите:

[[["你好世界","Hello World","Nǐ hǎo shìjiè",""]],,...

Что соответствует вашему выражению [[["something", "something", "something", ""]],

Когда вы переводите обратно на английский с китайского, вы получаете:

[[["Hello World","你好世界","","Nǐ hǎo shìjiè"]],,...

Который не соответствует, потому что у вас нет пустого "" в четвертом пункте в списке.

Исправьте ваш матчер:

# Note that I've added (.*) to the fourth item in the list
matcher = re.compile(r'\[\[\["(.*?)","(.*)","(.*)","(.*)"\]\]')

И вы получите:

你好 世界

Привет, мир

PS:

О UnicodeEncodeError: 'charmap' codec can't encode characters in position 38-41: character maps to <undefined>в основном говорит: "Я не могу преобразовать то, что вы передаете в кодек charmap (cmd coding)". Исправьте это, передав строку utf-8.

if __name__ == "__main__":
    t1 = do_trans("Hello World", "zh-CN", "en")
    print(t1.encode('utf-8'))
    t2 = do_trans(t1, "en", "zh-CN")
    print(t2.encode('utf-8'))

Хотя это что-то напечатает, я не смог заставить cmd выводить китайскую строку правильно, все еще ОЧЕНЬ ограниченная поддержка юникода в оболочке CMD.

Другие вопросы по тегам