プログラムで、URLからHTMLのタイトル情報を得たい!最近企業のHPでHTMLソースが暗号化されているものを多く見かけます。はじめは<title></title>の範囲内の文字を取得すれば良いと考えていましたが、暗号化されていることからそのまま取得すると訳のわからない文字列になってしまいます。

暗号化されているページのタイトルはどのようにすれば、取得できますでしょうか?教えていただきたくよろしくお願いします。開発環境はVC++6です。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2007/02/09 23:50:09
  • 終了:2007/02/15 00:04:18

ベストアンサー

id:andalusia No.1

andalusia回答回数134ベストアンサー獲得回数122007/02/10 00:21:43

ポイント100pt

企業のページで暗号化されているページは極めて少ないと思います。(互換性や、サーチエンジンにかからなくなるなど問題があるため)

文字コードが異なるだけではないでしょうか?

一度、そのページのソースを、K2Editorなどの、UnicodeやEUCに対応したエディタで開いてみてください。

http://k2top.jpn.org/index.php?K2Editor

id:harunoharuno

回答ありがとうございます。

たしかにEUCでした。

しかし、http://auctions.yahoo.co.jp/jp/

のように文字コードの種類charsetが記述されていないHPもあるので、文字コードの判定が難しそうですね。

2007/02/10 00:44:53

その他の回答(3件)

id:andalusia No.1

andalusia回答回数134ベストアンサー獲得回数122007/02/10 00:21:43ここでベストアンサー

ポイント100pt

企業のページで暗号化されているページは極めて少ないと思います。(互換性や、サーチエンジンにかからなくなるなど問題があるため)

文字コードが異なるだけではないでしょうか?

一度、そのページのソースを、K2Editorなどの、UnicodeやEUCに対応したエディタで開いてみてください。

http://k2top.jpn.org/index.php?K2Editor

id:harunoharuno

回答ありがとうございます。

たしかにEUCでした。

しかし、http://auctions.yahoo.co.jp/jp/

のように文字コードの種類charsetが記述されていないHPもあるので、文字コードの判定が難しそうですね。

2007/02/10 00:44:53
id:andalusia No.2

andalusia回答回数134ベストアンサー獲得回数122007/02/10 01:38:12

ポイント100pt

Yahoo!オークションのページでは、HTTPヘッダで文字コードが指定されているようです。

HTMLの仕様上、こちらが最優先となります。

1. HTTPにおけるContent-Typeヘッダのcharsetパラメータ

2. HTML文書内のMETA宣言およびhttp-equiv属性で設定された、Content-Typeヘッダのcharsetパラメータ

3. HTML文書内の各要素のcharset属性

Webブラウザが文字コードを判定する基準:iBook G4 Blog

id:harunoharuno

HTTPヘッダ・・・意識の外にありました。教えていただき大感謝です。しかし調べてみてもHTTP情報はどのように読み取ればいいのか、、、、

なかなか解りません。

参考になるリンクなどありましたら教えていただけませんか?

2007/02/10 10:57:23
id:ardarim No.3

ardarim回答回数897ベストアンサー獲得回数1452007/02/10 14:23:06

ポイント100pt

HTTPのヘッダ情報の取得ですが、どのようなAPIを使っているかによります。


WININET APIであれば、以下のように取得できます。

(1)HttpOpenRequest(サーバへのHTTPリクエスト準備)

(2)HttpSendRequest(サーバへのHTTPリクエスト送信)

(3)HttpQueryInfo(サーバからのHTTPレスポンス取得)

(4)InternetReadFile(データの取得)

(5)InternetCloseHandle


MFC I/Fについてはこちら


サンプルはこのあたりでしょうか。

HTTPサーバーからページを受信する

HTTP経由ファイル取得ツール(Visual C++版)


HttpQueryInfoでサーバから受信したHTTPレスポンスヘッダの情報を取得できます。第2パラメータにHTTP_QUERY_CONTENT_TYPEを指定するとContent-Typeフィールドを取得できます。


ただし、HTTPヘッダの情報はHTTP仕様上規定されているものですが、必ずしもすべてのWebサーバが正しい文字コードを返すとは限りません。たいていの場合はあっていますが、間違っている場合や明示されていない場合もありえます。

HTML内のcharset情報は、さらに当てになりません(すべきではありません)。これは、Webサーバにコンテンツをアップロードした後、Webサーバ側が文字コードを勝手に変換してしまう場合があるためです。


一番確実なのは、受信したデータを分析して自分で文字コードを判別することですが、これは難しいですし、EUCやシフトJISの仕様上100%確実に見分ける手段がないため、アルゴリズムが公開されていることはあまりないです。

これは公開されている例。

http://rryu.sakura.ne.jp/nisenise-fuhito/200204.html#2002-04-29

id:harunoharuno

回答ありがとうございます。教えていただいた方法で、

HTTPヘッダから文字コードを取得できるようになりました

しかし、文字コード判定で

ユーザが入力した値を優先しようと思っていたのですが、

サーバーにより自動変換されていることがあるんですね。

HTTPも完全ではないし、

勉強に文字コードを解析する方法を考えるのもいいかも・・・(けどむずかしそ)

教えていただいた、サンプルを拝見し勉強してみます。

あれっ?

そういえば私のプログラムではSHIFT-JISの

文字ならなんの変換をしなくても、普通に読み取ることが

できるのですが、これはマシンの言語設定などがSHIFT-JISなど

になっているからなんですか?

もしそうだとすると、

UTF-8の環境で文字を取得するには、

UTF-8の文字列に変換する必要があるのでしょうか?(EUCも同様の理解)

何度もお手数をおかけしますがどうか教えてください。

2007/02/11 11:26:09
id:ardarim No.4

ardarim回答回数897ベストアンサー獲得回数1452007/02/11 19:53:59

ポイント100pt

日本語Windowsの環境では、何もしなければシフトJISで記述された文字列を扱うことができます。UTF-8やEUCが使えるようになっている環境は設定上は可能ですが通常はまずありえません。


Windowsの文字コードの扱いは、Unicode(UTF-16)とそれ以外(マルチバイト系)に基本的に分かれます。システムである時点で同時に使えるマルチバイト系文字コードは、1種類のみで、これはシステムロカールにより決定され、コードページと呼ばれます。

日本語Windowsであれば、通常はコードページ932となっており、これは日本語(シフトJIS)の環境が選択されていることを意味します。仕組み上は、UTF-8やEUCをデフォルトコードページとして選択することは可能ですが、一般のアプリケーションはそのような環境で動作できるようにはできていませんので、そのような設定がされている環境は通常はありません。


Unicodeとマルチバイト系の文字コードは、MultiByteToWideChar()またはWideCharToMultiByte()のAPIで相互変換が可能です。

第一引数はコードページを指定するもので、通常はCP_ACPやCP_OEMCPを使っていると思いますが、この場合はデフォルトの932(シフトJIS)が使われます。

第一引数に直接 65001 (UTF-8のコードページ)や、51932 (EUCのコードページ)を指定すると、UTF-8<->Unicode(UTF-16)や、EUC<->Unicodeのコード変換が行えます。

id:harunoharuno

教えていただきありがとうございます。勉強になります。HttpQueryInfoでたまに文字コード情報を取得できないことがあるので取得文字コードの判定処理を組み込もうと思っているのですが、結構むずかしいですね。まだいろいろお聞きしたいこともあるのですが、本来の質問内容からずれてきたので本質門は終了します。

ardarimさんのお陰で少し前に進むことが出来ました。感謝です。

2007/02/15 00:03:37
  • id:sakacamprung
    thanks for the information that has been conveyed , very interesting.

    http://acemaxscare.com/cara-pemesanan-ace-maxs/
    http://obatkelenjargetahbening.9kes.com/
    http://obatuntukdiabetes.id/

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません