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

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

ただいまの
回答率

90.86%

  • PHP

    18612questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

[phpQuery]スクレイピングしてきた文字列が文字化けしている

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,613

kalon

score 77

いつもお世話になっております。

phpQueryでスクレイピングの練習をしているのですが、HTML構造はそのままコピーして来れているようですが、その中の日本語が文字化けしてしまします。

ターゲットにしている文字コードはUTF-8で、プログラムでもUTF-8を利用しているのですが、やはり文字化けしてしまします。そのようにしたら文字化けしないようにできるのでしょうか?

<?php
ini_set('display_errors',1);
header("Content-Type: text/html; charset=UTF-8");//文字化け防止


require_once('phpQuery.php'); //phpQueryというモジュールを使う

// HTMLデータを取得する
$html = file_get_contents('http://meigen.keiziban-jp.com/'); //ターゲットのURL

// HTMLをオブジェクトとして扱う
$doc = phpQuery::newDocument($html);
//$doc = phpQuery::newDocument($html, 'HTML-ENTITIES', 'EUC-JP');//ここでもUTF-8を指定して見るもWarning: DOMDocument::saveHTML(): unknown encodingが発生する

$messages = $doc['div.gaiyoutop']->find('.100sen'); //これだけでトリミングしたい要素が<html><header><body>付きで代入される

echo $messages; //文字化け!

文字化けした結果がこちらです。

<html><head><style id="style-1-cropbar-clipper">/* Copyright 2014 Evernote Corporation. All rights reserved. */
.en-markup-crop-options {
    top: 18px !important;
    left: 50% !important;
    margin-left: -100px !important;
    width: 200px !important;
    border: 2px rgba(255,255,255,.38) solid !important;
    border-radius: 4px !important;
}

.en-markup-crop-options div div:first-of-type {
    margin-left: 0px !important;
}
</style></head><body><p class="100sen">
「ありがとう」を伝え忘れると一生後悔するよ
<br>
(不明)
</p>
<p class="100sen">
経験というのは、莫大なお金に匹敵する価値がある<br>(ベンジャミン・フランクリン)
</p>
<p class="100sen">
人生は見たり、聞いたり、試したりの3つの知恵でまとまっているが
<br>
多くの人は見たり聞いたりばかりで
<br>
一番重要な“試したり”をほとんどしない<br>(本田宗一郎)
</p>
<p class="100sen">
人が想像できるすべての事は起こりうる現実ã&nbsp;<br>(ウィリー・ガロン)
</p>
<p class="100sen">
懐疑は発明の父である<br>(ガリレオ・ガリレイ)
</p>
<p class="100sen">
大きい夢を持て。小さい一歩を踏み出せ<br>(竹内均)
</p>
<p class="100sen">
無知を恐るるなかれ、偽りの知識を恐れよ<br>(ブレーズ・パスカル)
</p>
<p class="100sen">
実際に見ないと分からない。見ようとしなければ始まらない<br>(ガリレオ・ガリレイ)
</p>
<p class="100sen">
「まã&nbsp;足りないかもしれない」と考える<br>(松下幸之助)
</p>
<p class="100sen">
天才とは本質を見抜く人である<br>(カーライル)
</p>
<p class="100sen">
自然は我々の知性にとっては限りなく驚嘆すべきことを
<br>
最高度の容易さと単純さで行っているのã&nbsp;<br>(ガリレオ・ガリレイ)
</p>
<p class="100sen">
地球は俺の遊園地ã&nbsp;<br>(三浦雄一郎)
</p>
<p class="100sen">
花は何故美しいか。<br>一筋の気持ちで咲いているからã&nbsp;<br>(八木重吉)
</p>
<p class="100sen">
友達に好かれようなどと思わず、友達から孤立してもいいと腹を決めて
<br>
自分を貫いていけば本当の意味でみんなに喜ばれる人間になれる<br>(岡本太郎)
</p>
<p class="100sen">
相手の過ちを必要以上に追及した瞬間<br>不幸が始まります<br>(ジョセフ・マーフィー)
</p>
<p class="100sen">
大人は子供のé&nbsp;ƒã®ç´”粋なパワーをなくしてしまっている。
<br>
まず、「できない」ことから発想してしまう<br>(片山右京)
</p>
<p class="100sen">
結果ã&nbsp;けの成功に価値はない。
<br>
仲間と共に作ってきた過程にこそ、価値がある<br>(æ&nbsp;—城史多)
</p>
<p class="100sen">
花はたã&nbsp;咲く たã&nbsp;ひたすらに<br>(相田みつを)
</p>
<p class="100sen">
健康な人には病気になる心配があるが
<br>
病人には回復するという楽しみがある<br>(寺田寅彦)
</p>
<p class="100sen">
意識の高さと人生の充実度は連動している<br>(不明)
</p>
<p class="100sen">
「恥ずかしい」と感じることから進歩は始まる<br>(野村克也)
</p>
<p class="100sen">
逆境に勝る教育はない<br>(ベンジャミン・ディズレーリ)
</p>
<p class="100sen">
自分との約束がある<br>(岩川直裕)
</p>
<p class="100sen">
有名な人と普通の人を分けるのは
<br>
何かに打ち込んã&nbsp;量の差ã&nbsp;と思う<br>(イアン・ソープ)
</p>
<p class="100sen">
人と出会ったおかげで、自分とも出会えた<br>(谷川俊太郎)
</p>
<p class="100sen">
夢を実現できるか否かは途中で諦めるかどうかにかかっています。
<br>
必要なのは強い情熱(スティーブ・ジョブズ)
</p>
<p class="100sen">
例えその恐怖が合理的であっても挑戦するに値することであれば
<br>
その恐れをやり過ごして前に進むべきã&nbsp;<br>(イーロンマスク)
</p>
<p class="100sen">
情熱を持つ1人は、情熱を持たない100人に勝る<br>(ウォルト・ディズニー)
</p>
<p class="100sen">
本当に危険なのは、何もしないことã&nbsp;<br>(デニス・ウェイトリー)
</p>
<p class="100sen">
弱くても、もっと弱い奴を見つけちゃダメ<br>(田茂青志)
</p>
<p class="100sen">
出世とは「世に出る」と書く。会社に評価してもらうためではなく
<br>
どこに行っても通用する自分になるためにé&nbsp;‘張ること<br>(藤巻幸夫)
</p>
<p class="100sen">
真実はいつも少数派(湯川秀樹)
</p>
<p class="100sen">
もっとも危険なことは
<br>
敗北よりもむしろ自分の敗北を認めるのを恐れることであり
<br>
その敗北から何も学ばない事である<br>(レーニン)
</p>
<p class="100sen">
現代社会において最大のリスクは
<br>
「人生を後悔すること」ã&nbsp;と思うんです。
<br>
金銭的なリスクなんて、ある意味大したことはない<br>(三木谷浩史)
</p>
<p class="100sen">
成功する人は、リスクとギャンブルを見極めて行動する<br>(本田健)
</p>
<p class="100sen">
人生の目標は一つであっても、そこに到達するための道は人の数ã&nbsp;けある<br>(佐藤英樹)
</p>
<p class="100sen">
山は西からも東からでも登れる。
<br>
自分が方向を変えれば、新しい道はいくらでも開ける<br>(松下幸之助)
</p>
<p class="100sen">
あなたの人生をかわりに生きてくれる人はいないわ<br>(ドリー・パートン)
</p>
<p class="100sen">
臆病者の目には、敵は常に大軍に見える<br>(織田信長)
</p>
<p class="100sen">
人生から返ってくるのは、いつかあなたが投げた球<br>(斎藤茂太)
</p>
<p class="100sen">
ç´&nbsp;直な心・熱意・努力といった言葉は
<br>
あまりにプリミティブなために、誰も気に留めない。
<br>
しかし、そういう単純な原理こそが人生を決めていくポイントなのã&nbsp;<br>(稲盛和夫)
</p>
<p class="100sen">
僕が一番大事にしているのは「真・善・美」です。
<br>
商売の利害といったものよりも人間の良識を大事にしたい。
<br>
今あなたがやっていることは
<br>
社会のお役に立っていますかと考えることが大事です<br>(柳井正)
</p>
<p class="100sen">
明日に死を迎えるとしても
<br>
今日から幸福になって遅くないのです<br>(中村天風)
</p>
<p class="100sen">
続けることは難しいが続けたことã&nbsp;けが自信につながる<br>(小山進)
</p>
<p class="100sen">
成功の陰にはやはり苦労がある。<br>周りを否定するのではなく自分と向き合う事<br>(HIRO)
</p>
<p class="100sen">
人に裏切られたことなどない。自分が誤解していたã&nbsp;けã&nbsp;<br>(高倉健)
</p>
<p class="100sen">
無我夢中の時間の中にこそ、人生の充実がある<br>(安藤å¿&nbsp;雄)
</p>
<p class="100sen">
人生は「質問力」で決まります<br>(本田健)
</p>
<p class="100sen">
貴方のあらゆる言動を誉める人は信é&nbsp;¼ã™ã‚‹ã«å€¤ã—ない。
<br>
間違いを指摘してくれる人こそ信é&nbsp;¼ã§ãã‚‹<br>(ソクラテス)
</p>
<p class="100sen">
立派な人は何事にも道理にあうかどうかを考えてから行動に移す。
<br>
つまらない人は何事にも得するかどうかを考えてから行動に移す<br>(吉田松陰)
</p>
</body></html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

newDocumentの前にmb_convert_encodingでHTML-ENTITIESに変換しておくと直ります

$doc = phpQuery::newDocument(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));

※同じような事例がtaratailにあります。

phpQueryも内部的にはDOMDocumentを使っているので、HTML5形式の文字コード指定に対応していないのではないかと

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/15 06:02

    解決しました。phpQueryでも使えるとはつゆ知らずでした。ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18612questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。