utility
指定のページの指定のclass内を別のサイトのページに取り込むPHPコードVer2
作成日: 2025年1月22日
以前作ったものはその当時正しく動いたが、あるLP制作(マーケット無いし当然ニーズもない=無駄なもの)でコンテンツもろくでもなければってので最短で作ることを条件に既存ページからのスクレイピングをブロックごとに使ってやることにした際に、パースの精度に問題が出たので作り直した。
<?php
// スクレイピング対象のURL
$url = "URL";
// HTMLを取得
$context = stream_context_create([
'http' => [
'timeout' => 10,
'header' => "User-Agent: PHP\r\n",
]
]);
$html = @file_get_contents($url, false, $context);
if ($html === false) {
die("Failed to fetch content from the URL.");
}
// DOMDocumentでHTMLをパース
libxml_use_internal_errors(true); // パースエラーを無視
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
libxml_clear_errors();
// DOMXPathで特定のクラスを持つ要素を取得(順序指定)
$xpath = new DOMXPath($dom);
// 最初のクラス
$firstNode = $xpath->query("(//div[contains(@class, 'child_pages')])[1]"); // 1つ目の要素
if ($firstNode->length > 0) {
echo "最初の要素:\n" . $dom->saveHTML($firstNode->item(0)) . "\n\n";
}
// 2つ目のクラス
$secondNode = $xpath->query("(//div[contains(@class, 'child_pages')])[2]"); // 2つ目の要素
if ($secondNode->length > 0) {
echo "2つ目の要素:\n" . $dom->saveHTML($secondNode->item(0)) . "\n\n";
}
// 3つ目のクラス(必要なら追加)
$thirdNode = $xpath->query("(//div[contains(@class, 'child_pages')])[3]"); // 3つ目の要素
if ($thirdNode->length > 0) {
echo "3つ目の要素:\n" . $dom->saveHTML($thirdNode->item(0)) . "\n\n";
}
?>
同じクラスが複数あった場合配列として1度で持ってこれるが、引用元で間に別のクラスがある場合やその逆で何か挟みたいときは一つ目・二つ目などうまく使いまわせば可能。
まぁこちらの方が篤実かな。
要件的にはあくまでも引用元と先が同じドメイン所有者といったことが最低限。
商売上添え物的だったコンテンツをLPでちょっと出したいというようなレアケースで、運用管理の手間を減らすのに良いかなというところです。