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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

316閲覧

【js】jquery.xdomainajax.jsでの外部サイトのタイトル取得が動かない・・・。

gogoackman3

総合スコア109

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/07/02 18:19

編集2017/07/03 01:37

jquery.xdomainajax.jsを利用して外部サイトのタイトルを取得できるようなフォームを作成していました。(正常に動いていたのですが、動かなくなった。)

どうやらここ最近YQLの仕様が変わったことで、動かなくなっていたというところまではわかりました。
さらに調べて、この記事を参考にjquery.xdomainajax.jsのファイルを修正しました。

確かにレスポンスは返って来るようになったものの、未だページタイトルが取得できずに困っています。
該当箇所のJSは以下の通りです。

javascript

1$(document).on('click','.get-link-title-btn',function(){ 2 3 // urlを取得 4 var url = $('#url').val(); 5 6 // タイトルを取得 7 $.ajax({ 8 url: url, 9 type: 'GET', 10 dataType: 'html', 11 cache : false, 12 success: function(data) { 13 var row = data.responseText; 14 $.when( 15 xml = $.parseXML(row), 16 ).done(function(xml){ 17 var title = $(xml).find("title").text(); 18 // フォームに追加 19 if(title == "") { 20 alert("タイトルの取得に失敗しました。何度か試しても失敗する場合は手入力でお願いします。"); 21 } 22 else { 23 $('#link-title').val(title); 24 } 25 }); 26 }, error:function(e) { 27 alert("タイトルの取得に失敗しました。何度か試しても失敗する場合は手入力でお願いします。"); 28 } 29 }); 30 });

例えば、「https://www.yahoo.co.jp/」を叩いた場合の変数xmlは、以下のようなデータが返ってきます。
イメージ説明

それらしきデータなのですが、$(xml).find("title").text();としてタイトルタグのテキストを取得しようとすると何も取れません。

これは何が足りないのでしょうか??

【回答への追記】

以下のコードで実行

javascript

1var result = $(xml).find("result").text(); 2var title = $(result).find('title');

var title = $(result).find('title').text();で実行すると値が空になります。

var result = $(xml).find("result").text();の結果

var result = $(xml).find("result").text();の結果

var title = $(result).find('title');の結果

var title = $(result).find('title');の結果

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

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

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

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

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

guest

回答2

0

ベストアンサー

結果を確認された通りでxmlパースが完全にできていないことが原因だと思います。
result以下のタグを要素として取得できていないのでfindが動作していないです。
タイトルだけなら単純にxmlではなく文字列から取得してはどうでしょうか

var row = data.responseText; var found = row.match(/title>[\s\S]*?<\/title/i);

投稿2017/07/03 02:21

sha

総合スコア141

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

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

sha

2017/07/03 02:22 編集

上のコメントでsubstringで取得されたことを見落としていました。すみません。
gogoackman3

2017/07/03 02:25

ありがとうございます!
sha

2017/07/03 02:28 編集

var row = data.responseText.replace(/&gt;/g, '>').replace(/&lt;/g, '<'); とすれば var title = $(xml).find("title").text(); で取得できます。 レスポンスが「<」などを特殊文字表記にしていることが原因でパースできていないようです。
gogoackman3

2017/07/03 02:29

なるほどなるほど、そうなんですね、最初.responseTextで結果を取得した時に"<",">"がエスケープされていたのが引っかかっていました。そのやり方があるんですね、勉強になりました。
guest

0

レスポンスデータを見る限り、resultタグのテキストノードに取得した外部ページのhtmlコードが入ってきているようなので、一旦resultタグのテキストを抜き出し、jQueryオブジェクト化した後にtitleタグを抜き出してみては?

javascript

1var resultText = $(xml).find('result').text(); 2var title = $(resultText).find('title').text(); 3 4// var title = $($(xml).find('result').text()).find('title').text(); // 一行だとこう?

投稿2017/07/03 00:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gogoackman3

2017/07/03 01:39

回答ありがとうございます。さっそく試したところ結果的にはタイトルが取得できず、変数titleは空になりました。 本文に補足として実行コードと結果を記載したのですが、何か新たな問題点などありそうでしょうか??
gogoackman3

2017/07/03 01:49

綺麗ではないですが、var title = result.substring(result.indexOf("<title>")+7,result.indexOf("</title>"));で取得してしまいました・・・!先ほど回答頂いたやり方でもし何かうまくいきそうな方法がありそうでしたら教えていただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問