人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

プログラムで、URLからHTMLのタイトル情報を得たい!最近企業のHPでHTMLソースが暗号化されているものを多く見かけます。はじめは<title></title>の範囲内の文字を取得すれば良いと考えていましたが、暗号化されていることからそのまま取得すると訳のわからない文字列になってしまいます。
暗号化されているページのタイトルはどのようにすれば、取得できますでしょうか?教えていただきたくよろしくお願いします。開発環境はVC++6です。

●質問者: harunoharuno
●カテゴリ:コンピュータ インターネット
✍キーワード:HP HTML URL VC++ ソース
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● andalusia
●100ポイント ベストアンサー

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

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

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

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

◎質問者からの返答

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

たしかにEUCでした。

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

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


2 ● andalusia
●100ポイント

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

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

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

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

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

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

◎質問者からの返答

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

なかなか解りません。

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


3 ● ardarim
●100ポイント

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

◎質問者からの返答

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

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

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

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

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

HTTPも完全ではないし、

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

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

あれっ?

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

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

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

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

もしそうだとすると、

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

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

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


4 ● ardarim
●100ポイント

日本語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のコード変換が行えます。

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ