首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

phpQuery 採集網頁完整指南:jQuery 語法解析 HTML/XML

     編輯:PHP 綜合知識

什麼是 phpQuery?

phpQuery 是 PHP 版 jQuery,支援 CSS 選擇器、DOM 遍歷、操作操作,讓伺服器端採集網頁如同瀏覽器端般直觀。

安裝與基本使用

<?php
require_once 'phpQuery/phpQuery.php'; // 或 composer require electrolinux/phpquery

// 從 URL 載入
phpQuery::newDocumentFile('https://example.com/news');
$title = pq('.headline h1:eq(0)')->html();
echo $title;

// 從字串載入
$html = file_get_contents('https://example.com');
phpQuery::newDocument($html);
$links = pq('a')->attr('href');

常見選擇器與操作

需求phpQuery 代碼說明
取得標題文字pq('h1')->text()純文字,去除標籤
取得 HTML 內容pq('.content')->html()保留內部標籤
取得屬性pq('img')->attr('src')單一元素
遍歷列表foreach(pq('.item') as $li) { pq($li)->find('h2')->text(); }需包裝 $li 為 pq 物件
第 N 個元素pq('li:eq(2)')索引從 0 開始
父/子/兄弟pq($el)->parent() / children() / next()DOM 遍歷

採集文章列表範例

<?php
phpQuery::newDocumentFile('https://blog.example.com');
$articles = [];

foreach (pq('.post-list .post') as $post) {
    $pq = pq($post); // 重要:包裝為 phpQuery 物件
    $articles[] = [
        'title'   => $pq->find('h2 a')->text(),
        'url'     => $pq->find('h2 a')->attr('href'),
        'summary' => $pq->find('.excerpt')->text(),
        'date'    => $pq->find('.meta .date')->attr('datetime'),
    ];
}
print_r($articles);

解析 XML 文件

<?php
$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<root>
  <contact><name>張三</name><age>22</age></contact>
  <contact><name>王五</name><age>18</age></contact>
</root>
XML;

phpQuery::newDocument($xml, 'text/xml'); // 指定 MIME 類型
$age = pq('contact:eq(0) > age')->text(); // 22
echo $age;

記憶體洩漏問題與解決

phpQuery 內部靜態陣列 phpQuery::$documents 會保存所有解析過的文件,大量採集導致記憶體暴增。

<?php
// 錯誤示範:記憶體持續增長
while ($url = $queue->pop()) {
    phpQuery::newDocumentFile($url);
    // 處理...
}

// 正確:每次解析後清理
while ($url = $queue->pop()) {
    phpQuery::newDocumentFile($url);
    // 處理...
    phpQuery::$documents = []; // 釋放文件物件
    // 或 unset(phpQuery::$documents[$id]);
}

進階技巧

  • 處理編碼:phpQuery::newDocument($html, 'utf-8') 或先 iconv()
  • 表單模擬:pq('form')->find('input[name=token]')->val('abc') 修改表單值
  • AJAX 內容:phpQuery 無法執行 JS,動態內容需配合 Selenium/Headless Chrome
  • 錯誤處理:try { phpQuery::newDocumentFile($url); } catch (Exception $e) { log($e); }

替代方案比較

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
工具優點缺點適用場景
phpQueryjQuery 語法、功能豐富記憶體洩漏、維護較少中小型採集、熟悉 jQuery
DOMDocument + XPath內建、記憶體穩定、標準語法較繁瑣大型採集、生產環境
Symfony DomCrawler現代、測試友善、無洩漏需 Composer 依賴新專案、整合 Symfony
Goutte內建 HTTP Client、表單處理依賴 Guzzle需登入/互動採集