カテゴリ: PHP 更新日: 2026/07/30

PHPでDOMXPathを使う方法!HTMLからタイトルやリンクを抽出する実践例

PHPでDOMXPathを使う方法!HTMLからタイトルやリンクを抽出する実践例
PHPでDOMXPathを使う方法!HTMLからタイトルやリンクを抽出する実践例

新人と先輩の会話形式で理解しよう

新人

「DOMXPathを学ぶとき、サンプルを写すだけで終わらないようにしたいです。」

先輩

「それなら、外部ページから必要な情報を取得する処理という具体例に置き換えて考えるといいですよ。使う値、処理、表示結果が見えると理解しやすくなります。」

新人

「コードのどこを変えれば応用できるかも知りたいです。」

先輩

「では、DOMXPathを中心に、入力チェック、表示、関数化、ログまで順番に見ていきましょう。」

1. 外部ページから必要な情報を取得する処理で取得してよい範囲を確認する

1. 外部ページから必要な情報を取得する処理で取得してよい範囲を確認する
1. 外部ページから必要な情報を取得する処理で取得してよい範囲を確認する

DOMXPathは、用語だけを見ると難しく感じますが、実際には「どの値を受け取り、どの形へ整えて、どこへ表示または保存するか」を決める作業です。この記事では 外部ページから必要な情報を取得する処理 を題材に、手を動かしながら流れを確認します。


<?php
$ch = curl_init("https://example.com/");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_USERAGENT => "PHP Study Bot/1.0",
]);

$html = curl_exec($ch);
curl_close($ch);
?>

2. DOMXPathを使ったHTML取得の最小コード

2. DOMXPathを使ったHTML取得の最小コード
2. DOMXPathを使ったHTML取得の最小コード

まずは最小コードで動きを見ます。大きな機能にする前に、DOMXPath の役割、入力値、出力結果を小さく確認しておくと、あとでエラーが出たときにも原因を追いやすくなります。


<?php
$value = trim($_POST["value"] ?? "");
$errors = [];

if ($value === "") {
    $errors[] = "値を入力してください。";
}
if (mb_strlen($value, "UTF-8") > 100) {
    $errors[] = "100文字以内で入力してください。";
}

if ($errors) {
    foreach ($errors as $error) {
        echo htmlspecialchars($error, ENT_QUOTES, "UTF-8") . "<br>";
    }
}
?>

3. DOMXPathやSimpleXMLで必要な項目だけ抜き出す

3. DOMXPathやSimpleXMLで必要な項目だけ抜き出す
3. DOMXPathやSimpleXMLで必要な項目だけ抜き出す

実務では、入力値が空だったり、想定外の文字列が入ったりします。ここを先にチェックしておくと、画面崩れ、DBエラー、意図しない処理をかなり減らせます。


<?php
function escapeHtml(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, "UTF-8");
}

$rows = [
    ["title" => "PHPサンプル", "status" => "公開"],
    ["title" => "入力チェック", "status" => "確認中"],
];
?>

<table>
<?php foreach ($rows as $row): ?>
    <tr>
        <td><?php echo escapeHtml($row["title"]); ?></td>
        <td><?php echo escapeHtml($row["status"]); ?></td>
    </tr>
<?php endforeach; ?>
</table>

4. 文字化け・タイムアウト・403を切り分ける

4. 文字化け・タイムアウト・403を切り分ける
4. 文字化け・タイムアウト・403を切り分ける

PHPで画面へ出す値は、基本的に表示直前でエスケープします。自分で用意した配列でも、将来フォームやDBから来る値へ変わる可能性があるため、安全な表示を習慣にします。


<?php
function normalizeText(?string $value): string
{
    $value = trim($value ?? "");
    return mb_convert_kana($value, "s", "UTF-8");
}

$keyword = normalizeText($_GET["keyword"] ?? "");
echo htmlspecialchars($keyword, ENT_QUOTES, "UTF-8");
?>

5. アクセス間隔とキャッシュで負荷を下げる

5. アクセス間隔とキャッシュで負荷を下げる
5. アクセス間隔とキャッシュで負荷を下げる

同じ処理が2回以上出てきたら、関数化を考えます。短い関数へ切り出すと、名前から目的が分かり、テストや修正もしやすくなります。


<?php
try {
    $result = ["ok" => true, "message" => "処理が完了しました。"];
    if (!$result["ok"]) {
        throw new RuntimeException($result["message"]);
    }
} catch (Throwable $e) {
    error_log($e->getMessage());
    echo "エラーが発生しました。";
}
?>

6. 取得失敗時のリトライとログ記録

6. 取得失敗時のリトライとログ記録
6. 取得失敗時のリトライとログ記録

エラー対策では、利用者へ見せるメッセージと、開発者が調査するログを分けます。画面にはやさしい文言、ログには日時やURLなど調査に必要な情報を残すと運用しやすくなります。


<?php
$log = [
    "time" => date("Y-m-d H:i:s"),
    "uri" => $_SERVER["REQUEST_URI"] ?? "",
    "ip" => $_SERVER["REMOTE_ADDR"] ?? "",
];

error_log(json_encode($log, JSON_UNESCAPED_UNICODE));
?>

7. 外部ページから必要な情報を取得する処理として使える保存コード

7. 外部ページから必要な情報を取得する処理として使える保存コード
7. 外部ページから必要な情報を取得する処理として使える保存コード

外部ページから必要な情報を取得する処理として使うなら、コードを1つの流れとして読めることが大切です。入力、処理、表示、エラー処理が離れすぎると、初心者は原因を見失いやすくなります。

まずは小さく動く形を作り、あとからDB保存、メール送信、ログ出力、テストを足していくと、無理なく実務的なコードへ育てられます。

8. 規約・robots.txt・著作権を確認する

8. 規約・robots.txt・著作権を確認する
8. 規約・robots.txt・著作権を確認する

DOMXPathを復習するときは、サンプルの変数名だけを変えるのではなく、入力値の種類、空データ、エラー時の表示まで変えて試してみましょう。そこまで確認すると、ただ動くコードから、壊れにくいPHPコードへ近づきます。

次の練習では、外部ページから必要な情報を取得する処理に検索条件、保存処理、権限チェックのどれか1つを追加してみてください。記事ごとのテーマを小さな機能へ落とし込むほど、学習記事としても実務メモとしても価値が出ます。

まとめ

まとめ
まとめ

DOMXPathとPHPでHTML解析を実務レベルで理解する

PHPでDOMXPathを使う方法は、単なるHTML解析のテクニックではなく、外部ページから必要な情報を安全かつ効率的に取得するための重要な技術です。特に、タイトル抽出、リンク取得、一覧データの取得といった処理は、スクレイピングやデータ収集の基本となります。 本記事では、curlでHTMLを取得し、DOMDocumentで解析し、DOMXPathで必要な要素を抽出するという一連の流れを確認しました。この流れは、PHPでWebデータを扱う上での基本パターンであり、ブログ記事の収集、商品情報の取得、ニュース一覧の生成など、さまざまな場面で活用できます。

入力チェックとエスケープ処理の重要性

DOMXPathを使う処理においては、入力値の検証とエスケープ処理が欠かせません。フォームから受け取った値や外部サイトから取得したデータには、予期しない文字列が含まれる可能性があります。そのため、trimやmb_strlenによる入力チェック、htmlspecialcharsによるエスケープ処理を徹底することで、XSS対策や画面崩れの防止につながります。 また、normalizeTextのような関数を使ってデータを正規化することで、検索条件のブレを防ぎ、安定した処理を実現できます。

エラー処理とログ設計で運用しやすいPHPコードにする

外部ページから情報を取得する処理では、タイムアウト、403エラー、文字化けなどの問題が発生する可能性があります。そのため、try-catchによる例外処理、error_logによるログ出力を組み合わせることが重要です。 利用者にはシンプルなエラーメッセージを表示し、開発者には詳細なログを残すことで、トラブルシューティングがしやすくなります。特に、アクセス日時、URI、IPアドレスなどをログに含めることで、問題の再現や原因特定が容易になります。

アクセス制御とキャッシュでパフォーマンスを最適化する

DOMXPathを使ったスクレイピング処理では、対象サイトへの負荷を考慮することが重要です。アクセス間隔を空ける、キャッシュを利用するなどの対策を行うことで、サーバー負荷を軽減し、安定した運用が可能になります。 また、同じHTMLを何度も取得するのではなく、一度取得したデータを保存して再利用することで、処理速度の向上にもつながります。

規約遵守と安全なデータ取得の考え方

外部ページからデータを取得する際には、必ず利用規約やrobots.txtを確認する必要があります。許可されていないページの取得や過度なアクセスは、サービスの利用停止や法的リスクにつながる可能性があります。 PHPでDOMXPathを使う技術だけでなく、どの範囲まで取得してよいかを判断することも、実務では重要なスキルです。

サンプルプログラム:DOMXPathでタイトルとリンクを取得する


<?php
$url = "https://example.com/";

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
]);

$html = curl_exec($ch);
curl_close($ch);

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

// タイトル取得
$titleNode = $xpath->query("//title")->item(0);
$title = $titleNode ? $titleNode->nodeValue : "";

// リンク取得
$links = [];
foreach ($xpath->query("//a") as $node) {
    $links[] = $node->getAttribute("href");
}

echo htmlspecialchars($title, ENT_QUOTES, "UTF-8") . "<br>";

foreach ($links as $link) {
    echo htmlspecialchars($link, ENT_QUOTES, "UTF-8") . "<br>";
}
?>

実務で活用するためのポイント整理

PHPでDOMXPathを使う場合は、単にデータを取得するだけでなく、入力チェック、エラー処理、ログ設計、キャッシュ、規約確認といった要素を組み合わせることで、実務で使えるコードになります。 また、関数化や共通処理の整理を行うことで、保守性の高いコードにすることができます。小さな処理を積み重ねていくことで、大規模なデータ取得システムへと発展させることも可能です。

先生と生徒の振り返り会話

生徒

「DOMXPathを使うことで、HTMLからタイトルやリンクを簡単に取得できることが分かりました。」

先生

「そうですね。PHPでのHTML解析は、DOMDocumentとDOMXPathを組み合わせることで柔軟に対応できます。」

生徒

「入力チェックやエスケープ処理も重要だと感じました。」

先生

「その通りです。外部データは信用せず、必ず検証とエスケープを行うことで、安全なPHPアプリケーションになります。」

生徒

「エラー処理やログも含めて設計する必要があるんですね。」

先生

「はい。DOMXPathの技術だけでなく、運用を意識した設計ができると実務レベルに近づきます。」

生徒

「規約やrobots.txtの確認も忘れないようにします。」

先生

「それがとても大切です。技術とルールの両方を理解してこそ、信頼されるエンジニアになります。」

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

PHP の Web スクレイピングの記事一覧へ
新着記事
New1
Python
Pythonの変数とは?定義方法とデータ型を初心者向けに解説
New2
PHP
PHP の型変換を完全ガイド!初心者でもわかる明示的変換・自動変換
New3
PHP
PHPのCSVファイルの読み書きと文字列処理を基礎から解説!初心者向けガイド
New4
PHP
PHPのメモリ管理と変数の破棄方法をやさしく解説!初心者でもわかるunsetの使い方
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでAPIリクエストを送信する方法を完全解説!requestsライブラリで簡単API通信
No.2
Java&Spring記事人気No2
Python
Pythonで経過時間を計測する方法を完全解説!初心者でもわかる time.perf_counter() と time.sleep()
No.3
Java&Spring記事人気No3
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化
No.4
Java&Spring記事人気No4
PHP
PHPの配列をソートする方法!sort, rsort, asort, ksortの使い方を丁寧に解説します!
No.5
Java&Spring記事人気No5
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
No.6
Java&Spring記事人気No6
Python
Pythonのタプルの要素を変更できない理由とその回避策を初心者向けに解説
No.7
Java&Spring記事人気No7
ChatGPT
ChatGPTでPythonコードを作成する方法!プロンプトの書き方と質問例を解説
No.8
Java&Spring記事人気No8
Python
Pythonのrequestsライブラリ完全入門!HTTPリクエストの送り方を初心者向けにやさしく解説