web-dev-qa-db-ja.com

PHPでウェブページを読む方法

PHPスクリプトを使用して、いくつかのWebページをテキストファイルに保存しようとしています。

PHPを使用してWebページをファイルバッファにロードし、HTMLタグを削除するにはどうすればよいですか?

15
Gavin

ただし、これらのいずれもサーバーで使用できることが保証されていません。

64
grawity

一方通行:

$url = "http://www.brothersoft.com/publisher/xtracomponents.html";
$page = file_get_contents($url);
$outfile = "xtracomponents.html";
file_put_contents($outfile, $page);

上記のコードは単なる例であり、(!)エラーのチェックと処理が欠けています。

6
ghostdog74

他の答えが言ったように、標準のPHPストリーム関数またはcURLがHTMLを取得するための最善の策です。タグを削除することに関して、ここにいくつかのアプローチがあります:

オプション#1:サーバーで利用可能な場合はTidy拡張機能を使用して、ドキュメントツリーを再帰的にウォークスルーし、ノードからテキストを返します。このようなもの:

function textFromHtml(TidyNode $node) {
    if ($node->isText()) {
        return $node->value;
    } else if ($node->hasChildren()) {
        $childText = '';
        foreach ($node->child as $child)
           $childText .= textFromHtml($child);
        return $childText;
    }
    return '';
}

たとえば、<br />タグ($node->name == 'br')を改行に置き換えるなど、それよりも洗練されたものが必要になる場合がありますが、これは最初から役立ちます。

次に、HTMLのテキストをTidyオブジェクトに読み込み、bodyノードで関数を呼び出します。文字列の内容がある場合は、次を使用します。

$tidy = new tidy();
$tidy->parseString($contents);
$text = textFromHtml($tidy->body());

オプション#2:正規表現を使用して、<>の間のすべてを削除します。たとえば、有効なHTMLの開始タグまたは終了タグのみに一致する、より洗練された正規表現を開発できます(おそらくそうすべきです)。ページのシナックスにエラーがある場合(本文の角かっこなど)、注意しないとゴミが出力される可能性があります。これがTidyがとても素敵な理由です(悪いページをクリーンアップするように特別に設計されています)が、利用できない場合があります。

2
Tim Yates

SimpleHTML DOMクラスをご覧になることを強くお勧めします。

SourceForgeのSimpleHTML DOMパーサー

これを使用すると、jQueryの$()関数やprototypeJS $$()関数と同様に、cssセレクターを使用してDOMツリーを検索できます。

File_get_contents()と連携してWebページのコンテンツを取得しますが、HTMLを渡すことができるのは、一部のcURLクラス(ログインなどが必要な場合)のみです。

0
Kemo