【问题标题】:Scraping HTML from Google Translate从谷歌翻译中抓取 HTML
【发布时间】:2013-01-15 13:49:23
【问题描述】:

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

我的示例字符串是"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 窗体的标签中显示翻译后的字符串。

我该怎么做?

【问题讨论】:

  • 与其依赖屏幕抓取,不如考虑使用谷歌为翻译服务提供的 API。一些文档可以找到here
  • 你为什么不使用Google Translate API?试图绕过计费?啧啧啧。
  • “你不能走这条路,先生,因为另一条路有收费站。”是的...不,我没看到。
  • 我想将“从英语翻译成孟加拉语”。但是在 Google Translate API 中“孟加拉语”不可用。

标签: c# .net winforms html-agility-pack google-translate


【解决方案1】:

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

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

【讨论】:

  • 我想将“从英语翻译成孟加拉语”。但是在 Google Translate API 中“孟加拉语”不可用。
  • @Bayazid,我所看到的一切都表明该 API 使用与其翻译页面相同的语言。你确定是这样吗?也许您只是在查看一些过时的文档。
  • 我可以免费使用api吗??在我的winform字典应用程序中使用api需要付费吗???
  • @Bayazid 寻找另一个翻译 API?还是自己写?
  • Bing 现在似乎是免费翻译 API 的共识选择 (microsoft.com/web/post/using-the-free-bing-translation-apis)。但是,他们还不支持孟加拉语。 MyMemory 有一个免费的 API,每天最多可处理 2500 个请求,而且它们确实支持孟加拉语:mymemory.translated.net/doc/spec.php
【解决方案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 将为空。

【讨论】:

    【解决方案3】:

    您应该考虑使用谷歌为翻译服务提供的 API,而不是依赖屏幕抓取。

    一些文档可以在here找到

    更新:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      相关资源
      最近更新 更多