1

我想使用谷歌翻译翻译一个字符串。

我的示例字符串是"this is my string".

我想使用 HTML Agility Pack 来解析 HTML 文档。

我试过这个:

using HtmlAgilityPack; 

........

var webGet = new HtmlWeb();
var document = webGet.Load(
    "http://translate.google.com/#en/bn/this%20is%20my%20string");

var node = document.DocumentNode.SelectNodes(
    "//span[@class='short_text' and @id='result_box']");

if (node != null)
{
    foreach (var xx in node)
    {
        x = xx.InnerText;
        MessageBox.Show(x);
    }
}

但我没有得到任何结果。

我的目标是使用谷歌翻译翻译一个完整的字符串,并在 Windows 窗体的标签中显示翻译后的字符串。

我怎样才能做到这一点?

4

3 回答 3

6

这是一个坏主意。正如评论者所指出的,谷歌提供了一个程序化界面作为付费服务。谷歌肯定有适当的安全功能来试图阻止你正在做的事情,这就是它不起作用的原因。也许你可以让它以某种方式工作,但即使这样,你也总是面临谷歌提高其安全性和你的脚本再次被阻止的危险。此外,您几乎可以肯定违反了 Google 的使用条款。

2017 更新: Microsoft Translator API现在支持孟加拉语,每月最多可免费使用 200 万个字符。

于 2013-01-15T13:59:21.953 回答
2

使用 HTML Agility Pack 的基本示例

using System;
using HtmlAgilityPack;    
class Traslator
    {
        private string url;
        private HtmlWeb web;
        private HtmlDocument htmlDoc;

        public Translator(string langPair) // LangPair = "SL|TL" ( Source Lang | Target Lang - Ex.: "en|pt"
        {
            this.url = "http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair=" + langPair;
            this.web = new HtmlWeb();
            this.htmlDoc = new HtmlDocument();
        }

        public string Translate(string input)
        {
            this.htmlDoc = web.Load(String.Format(this.url, Uri.EscapeUriString(input)));
            HtmlNode htmlNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"result_box\"]");
            return htmlNode.InnerText;
        }
    }

您的示例中出了什么问题:仅使用了 url...尝试检查 document.Text 道具以获取从 webGet 收到的 html...您将看到 span.result_box 将为空。

于 2017-06-08T17:05:08.017 回答
0

与其依赖屏幕抓取,不如考虑使用谷歌为翻译服务提供的 API。

一些文档可以在这里找到

更新:

我相信您对屏幕抓取方法的问题可能是翻译应用程序使用 Ajax 调用服务器端并检索翻译。使用下载时得到的页面HtmlWeb只是JS应用程序,它实际上不包含翻译。直到从页面向服务器发出调用后才会填写。

于 2013-01-15T13:51:09.660 回答