質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2548閲覧

c# WebBrowserでヤフー翻訳の結果を取得したい。

bybalsender

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/09/24 11:20

編集2016/09/24 11:29

「知恵」で質問しましたが回答が付きませんでしたので、こちらで質問させていただきました。

リストのList<string> _ant=new List<string>();にアドした
「てすと1」「テスト2」「test三」「test四」をヤフー翻訳で翻訳した結果をメッセージボックスに表示したいです。

一番下のメッセージボックスに翻訳結果が表示できる方法を教えてください。

以下のコードで試しましたが"てすと1"だけwebBrowser1の翻訳欄に表示されました。
但しメッセージボックスには表示されませんでした。

const string ur = "http://honyaku.yahoo.co.jp/transtext/";
List<string> _ant=new List<string>();
List<string> _arf = new List<string>();
static string _antans;
private void Form1_Shown(object sender, EventArgs e)
{
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate(ur);
_ant.Add("てすと1");
_ant.Add("テスト2");
_ant.Add("test三");
_ant.Add("test四");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (ur == e.Url.ToString())
{
foreach (string htm in _ant)
{
webBrowser1.Document.GetElementById("textText").InnerText = htm;
webBrowser1.Document.GetElementById("btn").InvokeMember("Click");
btn_click();
}
test();
}
}
private void btn_click()
{
_antans = webBrowser1.Document.GetElementById("trn_textText").InnerText;
_arf.Add(_antans);
}
private List<string> arf
{
get { return _arf; }
}
private void test()
{
foreach (string st in arf)
{
MessageBox.Show(st);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

c#

1async private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 2{ 3 if (ur == e.Url.ToString()) 4 { 5 var tasks = new List<Task>(); 6 7 foreach (string htm in _ant) 8 { 9 webBrowser1.Document.GetElementById("textText").InnerText = htm; 10 webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); 11 await Task.Run(() => 12 { 13 Thread.Sleep(1000); 14 }) 15 .ContinueWith(_ => btn_click(), TaskScheduler.FromCurrentSynchronizationContext()); 16 } 17 Task.WaitAll(tasks.ToArray()); 18 test(); 19 } 20}

初めは

c#

1webBrowser1.Document.GetElementById("textText").InnerText = htm; 2webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); 3while (webBrowser1.Document.GetElementById("trn_textText").InnerText == _arf.LastOrDefault()) 4{ 5 Application.DoEvents(); 6} 7btn_click();

でやってみたんですが、上手くいかなかったので適当に1秒待って結果を拾うようにしました。

ただし、どのような理由でWebBrowserクラスをご利用なのか分かりませんが、ただ翻訳結果が欲しいだけなのであれば、WebAPIを利用する方が合理的です。
ウェブスクレイピングは相手方のサーバーにも予期しない負荷をかけることがあるので、お作法的にもあまりよろしくないです。
どうしても代替手段がないときに仕方なく使うものだと思っています。

軽く調べてみましたが、Yahoo! Japanは翻訳APIを提供していないようですね。
Googleは有料、Bingは個人で使う分には実質無料(月200万文字以上は有料)らしいので、そこに対して

c#

1var wc = new WebClient(); 2string result = await wc.DownloadStringTaskAsync(webApiUrl);

などで結果を取得できると思います。

投稿2016/09/24 13:40

編集2016/09/24 13:44
htsign

総合スコア870

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bybalsender

2016/09/24 14:19

お返事有難う御座います。 >WebBrowserクラスをご利用なのか分かりませんが この方法しかわかりませんのでWebBrowserを利用しております。 >適当に1秒待って結果を拾うようにしました。 どこに書けばいいでしょうか? 書いていただいたコードでは翻訳側には広告しか表示されません。 どうすればいいでしょうか? 頂いた情報を元にコード修正してみました。 const string ur = "http://honyaku.yahoo.co.jp/transtext/"; List<string> _ant=new List<string>(); List<string> _arf = new List<string>(); static string _antans; private void Form1_Shown(object sender, EventArgs e) { webBrowser1.ScriptErrorsSuppressed = true; webBrowser1.Navigate(ur); _ant.Add("てすと1"); _ant.Add("テスト2"); _ant.Add("test三"); _ant.Add("test四"); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (ur == e.Url.ToString()) { foreach (string htm in _ant) { webBrowser1.Document.GetElementById("textText").InnerText = htm; webBrowser1.Document.GetElementById("btn").InvokeMember("Click"); System.Threading.Thread.Sleep(1000); while (webBrowser1.Document.GetElementById("trn_textText").InnerText == _arf.LastOrDefault()) { Application.DoEvents(); } btn_click(); } test(); } } private void btn_click() { _antans = webBrowser1.Document.GetElementById("trn_textText").InnerText; _arf.Add(_antans); } private List<string> arf { get { return _arf; } } private void test() { foreach (string st in arf) { MessageBox.Show(st); } }
htsign

2016/09/24 14:23

while (webBrowser1.Document.GetElementById("trn_textText").InnerText == _arf.LastOrDefault()) などと書いたコードは失敗例です。真似しても動かないと思います。 async private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) で始まっている方を元のコードのwebBrowser1_DocumentCompletedと置き換えてください。
bybalsender

2016/09/24 14:41

お返事有難う御座いました。 書いて頂いたコードを移植した結果無事動作致しました。 但し、見たこともない単語が沢山ありますのでこれから調べて理解したいと思います。 有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問