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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

2959閲覧

JAVAを使いURLからhtmlを読み込みたいです。

moment_now_love

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/10/01 06:34

編集2018/10/03 12:44

実現したいこと

JAVAを使いURLからhtmlを読み込みたいです。
説明

以下のソースコードを実行したところ、簡単なサイトのhtmlは読み込めるのですが、ヤフーなどの複雑なサイトのhtmlを正確に読み取ることができません。
正確に読み取れないとは以下のソースコードならば最後の行の「<meta property="og:title" content="Yahoo! JAPAN"><meta property="og:type" content="article">
この部分が読み込めてなかったりします。

<html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="content-style-type" content="text/css"> <meta http-equiv="content-script-type" content="text/javascript"> <meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、天気、スポーツ、メール、ショッピングなど多数のサービスを展開。あなたの生活をより豊かにする「課題解決エンジン」を目指していきます。"> <meta name="robots" content="noodp"> <meta name="google-site-verification" content="fsLMOiigp5fIpCDMEVodQnQC7jIY1K3UXW5QkQcBmVs"> <link rel="alternate" href="android-app://jp.co.yahoo.android.yjtop/yahoojapan/home/top"> <link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.yahoo.co.jp/"> <link rel="canonical" href="https://www.yahoo.co.jp/" /> <meta property="og:title" content="Yahoo! JAPAN"><meta property="og:type" content="article">

以下はURLからソースコードを習得するプログラムです

import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; public class Hero { public static void main(final String[] args){ URL url = null; InputStreamReader isr = null; try { url = new URL("[リンク内容](https://www.yahoo.co.jp/)"); // InputStream(バイトストリーム)のままでもHTMLは取得できるが文字化けする InputStream is = url.openStream(); // InputStreamをUTF8のInputStreamReader(文字ストリーム)に変換する isr = new InputStreamReader(is,"UTF-8"); // 一文字毎に読み込む while(true) { int i = isr.read(); if (i == -1) { break; } System.out.print((char)i); } }catch (Exception e) { System.out.println(e.getMessage()); }finally { try { isr.close(); }catch (Exception e) { System.out.println(e.getMessage()); } } }

質問

  1. なぜ正確にHTMLを正確に読み込めないのか?
  2. どのようにすれば読み込めるようになるのか?

以下のようになってしまいます。
イメージ説明

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

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

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

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

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

mather

2018/10/01 06:37

また「正確に読み取ることができない」というのは具体的にどういう意味ですか?現状の具体的な問題点を質問に書き足してください。
moment_now_love

2018/10/01 06:45

修正させていただきます。分かりにくい質問をしてしまい申し訳ないです。
m.ts10806

2018/10/01 07:05

「できていないこと」はもちろん明確にしていただいているので分かりますが「できていること・起きていること」を提示してください。問題の切り分けをしましょう。デバッグもしてください。
dice142

2018/10/01 07:06

「読み込めない」とは「途中で例外が出る」のか「処理が最後まで続くか出力されない行がある」のかどちらでしょうか?また、提示されたHTMLの例からは「最後の行が読み取れない」のか「実際のyahooのHTMLでその行が読み取れない」のかどちらでしょうか?
moment_now_love

2018/10/03 11:39

「処理が最後まで続くか出力されない行がある」、「実際のyahooのHTMLでその行が読み取れない」ということです!説明不足で申し訳ないです。
guest

回答3

0

ベストアンサー

それっぽいユーザーエージェントを指定してみてはどうでしょうか?
おそらく「正確」にとは、ブラウザで表示されてるものと同等のものであること。
という定義だと推測しています。
ただ、noscriptとかは表示されてしまうかもしれません。

Java

1import java.io.InputStream; 2import java.io.InputStreamReader; 3import java.net.URL; 4import java.net.URLConnection;

Java

1public static void main(final String[] args) { 2 URL url = null; 3 InputStreamReader isr = null; 4 5 try { 6 url = new URL("https://www.yahoo.co.jp/"); 7 URLConnection urlcon = url.openConnection(); 8 urlcon.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"); 9 10 // InputStream(バイトストリーム)のままでもHTMLは取得できるが文字化けする 11 InputStream is = urlcon.getInputStream(); 12 13 // InputStreamをUTF8のInputStreamReader(文字ストリーム)に変換する 14 isr = new InputStreamReader(is, "UTF-8"); 15 16 // 一文字毎に読み込む 17 while (true) { 18 int i = isr.read(); 19 if (i == -1) { 20 break; 21 } 22 System.out.print((char) i); 23 } 24 } catch (Exception e) { 25 System.out.println(e.getMessage()); 26 } finally { 27 try { 28 isr.close(); 29 } catch (Exception e) { 30 System.out.println(e.getMessage()); 31 } 32 } 33 34}

投稿2018/10/01 06:52

root_jp

総合スコア4666

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

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

moment_now_love

2018/10/03 12:05

無知で申し訳ないのですが、それはヤフーのどういったページのhtmlを読み込んでいるのでしょうか?
moment_now_love

2018/10/03 12:42 編集

読み込んだソースをhtmlで表示させると全然違う形式になってしまいます。
root_jp

2018/10/04 00:39

CSSが読み込めてないからじゃないですかね。 取得されたHTMLには、href="//s.yimg.jp/images/top/sp2/clr/180312/1.css" のような感じで CSSのパスが指定されています。読んでみましたか? パスにスキーム部が指定されていませんね(http とか https) この場合、現在使われているスキームを使ってアクセスしようとします。 おそらくあなたは、上記プログラムの結果をコンソールからコピーして、それをファイルに貼り付け、 そのファイルをブラウザで開いてるのではないでしょうか? つまり、さきほどのCSSへのパスは file:///s.yimg.jp/images/top/sp2/clr/180312/1.css として アクセスしようとしているはずです。 あなたのローカルにそのようなCSSファイルはあるはずもないため、レイアウトがくずれているだけだと思います。 「JAVAを使いURLからhtmlを読み込みたいです。」という目的は達成しています。
root_jp

2018/10/04 01:10

取得したHTMLをファイルに貼り付けてブラウザで表示してみました。 やはりCSSの読み込みができてなくて、多少そっけない感じにはなっていますが、 誰が見てもYahooのトップページだと分かる程度には表示されてます。 何か別のHTMLを表示しているのではないでしょうか?
moment_now_love

2018/10/04 01:50

詳しいご回答ありがとうございます。 CSSを読み込むことができていなかったのですね。 ありがとうございました。
guest

0

一部の内容が取得できないと悩んでいるようですが、

$ curl 'https://www.yahoo.co.jp/'

というコマンドや、読み込んだ内容を全文出力してみるなどして直接HTMLを見てみましょう。
質問にあるような meta タグの部分はそもそもHTMLとして出力されていないことがわかります。

おそらくブラウザの開発者ツールなどでHTMLを確認したと思うのですが、JavaScriptによりレンダリングされるタグも表示されているのでご注意ください。

投稿2018/10/01 07:20

mather

総合スコア6753

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

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

mather

2018/10/01 07:22

root_jpさんのUserAgentの方が正しいようですね。
guest

0

1.なぜ正確にHTMLを正確に読み込めないのか?

正確にHTMLを読み込めていると思います。サーバー側は誰にでも同じHTMLを返すのではなく、クライアントから送られてきたリクエストに対して、別のHTMLを(動的に生成して)返すことがあります。例えば同じURLを取得するにしても、日本語、英語など言語設定の違うクライアントには別の言語で返したり、ブラウザが何で、バージョンが何なのかによって、HTMLやら諸々の情報を別の内容で返したりします。

皆さんが説明されているとおり、User-Agent=ブラウザの種類・バージョンの設定がJavaプログラムでは恐らく未設定であるため、内容が変わっている、ということだと思います。

2.どのようにすれば読み込めるようになるのか?

これはroot_jpさんの言うとおり、User-Agentを既存のよくあるブラウザだと偽って設定してあげればいいと思います。root_jpさんの設定だと、Firefoxあたりでしょうかね。実際にはただのJavaプログラムなのですが、サーバー側ではそのプログラムがFirefoxであるかと勘違いして、HTMLを返してくれます。

余計なことしてたらすみません。

投稿2018/10/06 07:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問