Задать вопрос

Как автоматически получить транскрипцию английского слова из Яндекс-переводчика?

Здравствуйте.

Я хочу автоматически получать транскрипции английских слов из Яндекс-переводчика. Так как в API Яндекс-переводчика я не нашел возможности получать кроме простого перевода ещё и транскрипции, то я решил осуществлять "самостоятельное" получение транскрипций, через парсинг html-кода на web-странице Яндекс-переводчика. Для этого я написал следующее консольное приложение на C#:
string sURL = "https://translate.yandex.ru/?text=" + "beware" + "&lang=en-ru";

            //string html;
            //HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sURL);
            //HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            //using (StreamReader stream = new StreamReader(
            //     resp.GetResponseStream()))
            //{
            //    html = stream.ReadToEnd();
            //}

            WebClient client = new WebClient();
            var data = client.DownloadData(sURL);
            var html = Encoding.UTF8.GetString(data);

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

            doc.LoadHtml(html);

            var x = doc.DocumentNode;

            Console.WriteLine("После этой строки появляется ошибка" + x); // В консоли заместо  'x'  будет выведено HtmlAgillityPack.HtmlNode

            //var y = x.SelectNodes("//span[@class='dictionary-transcription']");
            var y = x.SelectNodes("id('dictionaryContent')/x:li[1]/x:div/x:span[1]"); //XPATH-селектор мне автоматически сгенерировал браузер Firefox


            var z = y.ToList();


            string Text = "Пусто";
            foreach (HtmlNode node in z)
            {
                Text = node.InnerText;
            }
            Console.WriteLine(Text);
            Console.ReadLine();


В процессе выполнения программы, в строке:
var y = x.SelectNodes("некий XPATH-селектор");
я получаю ошибку:
"Необработанное исключение типа "System.Xml.XPath.XPathException" в System.Xml.dll
Дополнительные сведения: Требуется диспетчер пространств имен или XsltContext. Этот запрос содержит префикс, переменную или определенную пользователем функцию."

После появления этой ошибки я на всякий случай добавил пространство имен:
using System.Xml.Xsl;
но это ничего не изменило.

Как решить эту ошибку?

P.S. Для парсинга HTML-кода я использую библиотеку HtmlAgilityPack.

P.P.S. Я сейчас изучил HTML-код который я выгружаю с web-страницы Яндекс-переводчика, и обнаружил:
<span class="dictionary-transcription">[{{transcription}}]</span>

То есть Яндекс-переводчик никакой транскрипции еще не успел вставить между тегами <span></span>
  • Вопрос задан
  • 4308 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Gorily
@Gorily
Сразу предупреждаю: вы должны понимать, что нарушаете правила пользования сервисами Яндекса и ни в коем случае не должны использовать такие решения в коммерческих целях. Надеюсь на ваше благоразумие.

По поводу решения: лучше зайти со стороны внутреннего API, используемого на сайте.
Вот простейший вариант решения. Для парсинга Json используется библиотека Json.Net (можете переписать на парсинг стандартной библиотекой .Net, мне просто так было быстрее написать пример).
const string text = "dog";
var translateUrl = "https://dictionary.yandex.net/dicservice.json/lookup?ui=ru&text="
                    + text + "&lang=en-ru&flags=23";

using (var wc = new WebClient())
{
    wc.Encoding = Encoding.UTF8;
    var resultHtml = wc.DownloadString(translateUrl);
    dynamic trsJson = JObject.Parse(resultHtml);

    var trs = trsJson.def[0].ts;
    Console.WriteLine("Транскрипция: " + trs);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@gloomyad
В Документации Yandex API есть пояснение где лежит транскрипция.

Таблица 1. Элементы XML-схемы ответа DicResult

head Заголовок результата (не используется).
def Массив словарных статей. В атрибуте ts может указываться транскрипция искомого слова.
tr Массив переводов.
syn Массив синонимов.
mean Массив значений.
ex Массив примеров.
Ответ написан
Комментировать
@BuZZZard
В API Яндекс-переводчика нет транскрипций. А вот в API Яндекс-Словаря - есть.
Ключи для словаря и переводчика нужно получать разные. Ключ от переводчика не подходит для словаря.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы