phpQuery

1.解決不能抓取https協(xié)議的請求痢畜,在服務(wù)器上開啟openssl擴展
wamp: php.ini 中 ;extension=php_openssl.dll 前的分號去掉
lnmp:需要安裝php_openssl.so擴展

使用過的方法

        vendor('phpQuery.phpQuery');
        \phpQuery::newDocumentHTML($content);

        //獲取所有標(biāo)簽的style屬性
        $totalNum = 0;
        $replaceNum = 0;
        foreach(pq("[style]") as $node) {
            $totalNum++;
            $styleStr = pq($node)->attr("style");

            //將 " | 雙引號 '|單引號  $#39;|單引號
            $styleStrReplaced = str_replace(array('"','''),array('"','\''),$styleStr);

            //字號處理
            $styleStrReplaced = preg_replace('/font-size:\s?[^;]*\s?;?/','',$styleStrReplaced);

            //字體處理
            $styleStrReplaced = preg_replace('/font-family:\s?[^;]*\s?;?/','',$styleStrReplaced);

            if($styleStrReplaced != $styleStr) {
                $content = str_replace($styleStr,$styleStrReplaced,$content);
                $replaceNum++;
            }
        }

phpQuery手冊

文檔轉(zhuǎn)載 https://www.wangjingxian.cn/php/361.html

1 引入phpquery類庫 下載鏈接:在文章最下方 提取碼:vje0

include 'phpQuery/phpQuery.php';

2 加載需要獲取內(nèi)容的網(wǎng)頁連接或則文檔

加載文檔主要通過phpQuery::newDocument()來進行操作,其作用是使得phpQuery可以在服務(wù)器預(yù)先讀取到指定的文件或文本內(nèi)容倚聚。
主要的常用方法包括: 
phpQuery::newDocumentFile($file线衫,$contentType = null) 
$file可以是一個網(wǎng)址地址(帶http的)或則html文件路徑,如果 $contentType為空,則根據(jù)文檔自動檢測編碼。
檢測失敗,則對于text/html類型文檔自動賦予utf-8編碼惑折。

phpQuery::newDocument($html)

$html是html格式的字符串或則代碼授账;

<?php
header("Content-Type: text/html;charset=utf-8"); 
require('phpQuery/phpQuery.php');
/*通過讀取URL或則文件路徑 返回值是該網(wǎng)站或文件的html,一個網(wǎng)頁對應(yīng)著一個html文件*/
/*eg 1*/
$eg1=phpQuery::newDocumentFile("test.htm");
 
/*eg 2*/
 $eg2=phpQuery::newDocumentFile("http://www.baidu.com");
 
//可以通過echo htmlentities($eg1,ENT_QUOTES,"UTF-8");查看返回值唬复。注意htmlentities()函數(shù)可以輸出原始html代碼。
 
/*eg 3*/
//讀入html
$html="<div>
        <ul>
            <li>第一行</li>
            <li>第二行</li>
        </ul>
       </div";
$eg3=phpQuery::newDocument($html);//輸入入?yún)?shù)為html
 
?>

phpQuery::newDocument($file)初始加載時返回html的串后全肮,就可以使用html操作句柄函數(shù)——pq()敞咧,通過pq()來篩選提取指定的內(nèi)容辜腺。
其他載入文檔方法如下:
Query::newDocument($html, $contentType = null) 
根據(jù)標(biāo)記URL新建一個文檔休建。如果 $contentType為空,則根據(jù)文檔自動檢測編碼。檢測失敗, 則對于text/html類型文檔自動賦予utf-8編碼评疗。
phpQuery::newDocumentFile($file, $contentType = null) 
根據(jù)文件新建一個文檔测砂。類似于newDocument()
phpQuery::newDocumentHTML($html, $charset = 'utf-8')
phpQuery::newDocumentXHTML($html, $charset = 'utf-8')
phpQuery::newDocumentXML($html, $charset = 'utf-8')
phpQuery::newDocumentPHP($html, $contentType = null) 
phpQuery::newDocumentFileHTML($file, $charset = 'utf-8')
phpQuery::newDocumentFileXHTML($file, $charset = 'utf-8')
phpQuery::newDocumentFileXML($file, $charset = 'utf-8')
phpQuery::newDocumentFilePHP($file, $contentType)


3 pq()函數(shù)用法

pq($param, $context = null); 
pq()函數(shù)的用法是phpQuery的重點,pq($xpath,$DocumentID)函數(shù)有個參數(shù)百匆,第一個$xpath是通過html標(biāo)簽/類/id等定位到某一元素砌些,
$DocumentID可以看做為一個指針,指向需要查詢的html文檔(也就是phpQuery::newDocumentFile($file)的返回結(jié)果,
如:$eg1或$eg2或$eg3——其實也就是html的context)存璃。當(dāng)同時對多個文檔操作時仑荐,需要用到這個參數(shù),如果沒有給出纵东,會自動鄰近匹配匹配粘招,
因此如果只對一個文檔操作時,可以省略即使用——pq($xpath)就可以偎球。 
pq(); 相當(dāng)于 jQuery的$();洒扎。
主要分兩部分:即選擇器和過濾器

4 選擇器

【基本選擇器】
#id 根據(jù)給定的ID屬性匹配單個元素。
element 根據(jù)給定的名稱匹配所有符合的元素衰絮。
.class 根據(jù)給定的class匹配所有的元素袍冷。
* 選擇所有元素。
selector1, selector2, selectorN 根據(jù)所有制定的選擇器匹配結(jié)合結(jié)果 選擇結(jié)果是取并集

/* 基本選擇器*/
1)  #id                     pq("#myDiv");
2)  element                 pq("div"); 
3)  .class                  pq(".myClass"); 
4)  *                       pq("*")
5)  selector1,selectorN     pq("div,span,p.myClass")

【層次選擇器】
ancestor descendant 匹配由先祖指定的元素的后代指定的所有后代元素岂傲。
parent > child 匹配由父元素指定的子元素指定的所有子元素难裆。
prev + next 根據(jù)指定的”next”和指定的”prev”匹配所有的下一個元素。
prev ~ siblings 匹配根據(jù)”prev” 元素的 所有相鄰元素镊掖。

/* 層次選擇器*/
1)  ancestor descendant     pq("form input") 
2)  parent > child          pq("form > input") 
3)  prev + next             pq("label + input") 
4)  prev ~ siblings         pq("form ~ input")

5 過濾器

【基礎(chǔ)過濾 】
:first 匹配第一個被選擇的元素乃戈。
:last 匹配最后一個被選擇的元素。
:not(selector) 匹配所有不是被選擇的元素亩进。
:even 匹配所有被選擇的偶數(shù)元素症虑,0索引。
:odd 匹配所有被選擇的奇數(shù)元素归薛,0索引谍憔。
:eq(index) 匹配等同于給定的索引的元素。
:gt(index) 匹配大于給定的索引的元素主籍。
:lt(index) 匹配小于給定的索引的元素习贫。
:header 匹配所有header元素,如h1,h2,h3等千元。
:animated 匹配正在進行動畫效果的元素苫昌。

/*基礎(chǔ)過濾*/
1)  :first                  pq("tr:first") 
2)  :last                   pq("tr:last") 
3)  :not(selector)          pq("input:not(:checked)") 
4)  :even                   pq("tr:even") 
5)  :odd                    pq("tr:odd") 
6)  :eq(index)              pq("tr:eq(1)")
7)  :gt(index)              pq("tr:gt(0)") 
8)  :lt(index)              pq("tr:lt(2)")
9)  :header                 pq(":header").css("background", "#EEE");

【內(nèi)容過濾】
:contains(text) 匹配包含指定文本的元素。
:empty 匹配所有無子節(jié)點的元素(包括文本節(jié)點)幸海。
:has(selector) 匹配至少包含一個對于給定選擇器的元素祟身。
:parent 匹配所有父元素 - 擁有子元素的,包括文本物独。

/*內(nèi)容過濾*/
1)  :contains(text)         pq("div:contains('John')") 
2)  :empty                  pq("td:empty") 
3)  :has(selector)          pq("div:has(p)").addClass("test"); 
4)  :parent                 pq("td:parent")

【屬性過濾】
[attribute] 匹配給定屬性的元素袜硫。
[attribute=value] 匹配給定屬性等于確定值的元素。
[attribute!=value] 匹配給定屬性不等于確定值的元素挡篓。
[attribute^=value] 匹配給定屬性是確定值開始的元素婉陷。
[attribute$=value] 匹配給定屬性是確定值結(jié)尾的元素。
[attribute*=value] 匹配給定屬性包含確定值的元素。
[selector1selector2selectorN] 匹配給定屬性并且包含確定值的元素憨攒。

1)  [attribute]             pq("div[id]") 
2)  [attribute=value]       pq("input[name='newsletter']").attr("checked", true); 
3)  [attribute!=value]      pq("input[name!='newsletter']").attr("checked", true); 
4)  [attribute^=value]      pq("input[name^='news']")
5)  [attribute$=value]      pq("input[name$='letter']")
6)  [attribute*=value]      pq("input[name*='man']")
7)  [selector1][selectorN]  pq("input[id][name$='man']")

【子元素過濾 】
:nth-child(index/even/odd/equation) 匹配所有是父元素的第n個的子元素世杀,或者是父元素的偶數(shù)或者奇數(shù)子元素。
:first-child 匹配所有是父元素的第一個的子元素肝集。
:last-child 匹配所有是父元素的最后一個的子元素瞻坝。
:only-child 匹配所有是父元素唯一子元素的子元素。

1)  :nth-child(index/even/odd/equation) pq("ul li:nth-child(2)")
2)  :first-child                        pq("ul li:first-child")
3)  :last-child                         pq("ul li:last-child")
4)  :only-child                         pq("ul li:only-child")

【基于表單 】
:input 匹配input, textarea, select和button元素杏瞻。
:text 匹配所有類型為text的input元素所刀。
:password 匹配所有類型為password的input元素。
:radio 匹配所有類型為radio的input元素捞挥。
:checkbox 匹配所有類型為checkbox的input元素浮创。
:submit 匹配所有類型為submit的input元素。
:image 匹配所有類型為image的input元素砌函。
:reset 匹配所有類型為reset的input元素斩披。
:button 匹配所有類型為button的input元素和button元素。
:file 匹配所有類型為file的input元素讹俊。
:hidden 匹配所有類型為hidden的input元素或者其他hidden元素垦沉。

1)  :input                  pq(":input")
2)  :text                   pq(":text")
3)  :password               pq(":password")
4)  :radio                  pq(":radio")
5)  :checkbox               pq(":checkbox")
6)  :submit                 pq(":submit")
7)  :image                  pq(":image")
8)  :reset                  pq(":reset") 
9)  :button                 pq(":button")
10) :file                   pq(":file")
11) :hidden                 pq("tr:hidden")

【表單過濾 】
:enabled 匹配所有可用元素。
:disabled 匹配所有不可用元素仍劈。
:checked 匹配所有被勾選的元素厕倍。
:selected 匹配所有被選擇的元素。

1)  :enabled                pq("input:enabled")
2)  :disabled               pq("input:disabled")
3)  :checked                pq("input:checked")
4)  :selected               pq("select option:selected")

【attr屬性獲取】
attr($name) 訪問第一個給名稱的元素的屬性贩疙。這個方法可以很輕易地取得第一個匹配到的元素的屬性值讹弯。如果這個元素沒有對應(yīng)名稱的屬性則返回undefined。
attr($properties) 對于所有匹配到的元素設(shè)置對應(yīng)屬性这溅。
attr($key, $value) 對于匹配到的元素設(shè)置一個屬性和對應(yīng)值组民。
attr($key, $fn) 對于匹配到的元素設(shè)置一個屬性和需要計算的值。
removeAttr($name) 對匹配到的元素移除給定名稱的屬性悲靴。
addClass($class) 對匹配到的元素添加一個給定的類臭胜。
hasClass($class) 如果有至少一個匹配到的元素包含給定的類則返回true。
removeClass($class) 對匹配到的元素移除給定名稱的類对竣。
toggleClass($class) 對匹配到的元素庇楞,如果類不存在則添加榜配,如果存在則移除否纬。

1)  attr                    pq("img")->attr("src");
2)  attr(properties)        pq("img")->attr({ src: "test.jpg", alt: "Test Image" });
3)  attr(key,value)         pq("img")->attr("src","test.jpg");
4)  attr(key,fn)            pq("img")->attr("title", function() { return this.src });
5)  removeAttr(name)        pq("img")->removeAttr("src");
6)  addClass(class)         pq("p")->addClass("selected");
7)  removeClass(class)      pq("p")->removeClass("selected");
8)  toggleClass(class)      pq("p")->toggleClass("selected");

【HTML獲取】
html() 獲取第一個匹配到的元素的html內(nèi)容(innerHTML)。這個方法不適用于XML文本(但適用于XHTML蛋褥。)
html($val) 對匹配到的元素設(shè)置html內(nèi)容临燃。這個方法不適用于XML文本(但適用于XHTML。)

1) html()                  pq("div")->html();
2) html(val)               pq("div")->html("<p>Hello Again</p>");

【text獲取】
text() 獲取匹配到的所有元素的文本內(nèi)容。
text($val) 對匹配到的所有元素設(shè)置文本內(nèi)容膜廊。

1) text()                  pq("p")->text();
2) text(val)               pq("p")->text("<b>Some</b> new text.");

【Value 獲取】
val() 獲取匹配到的第一個元素的value屬性的值乏沸。
val($val) 對匹配到的元素設(shè)置value值。val($val) 所有的Checks, selects, radio buttons, checkboxes,和select options都會設(shè)置相應(yīng)給定的值爪瓜。

1) val()                   pq("input")->val();
2) val(val)                pq("input")->val("hello world!");

【其他篩選和文檔處理】
\*篩選*\
1)  eq(index)               pq("p")->eq(1)
2)  hasClass(class)         pq("div")->hasClass("protected")
3)  filter(expr)            pq("p")->filter(".selected") 
4)  filter(fn)              pq("p")->filter(function($index) {
                              return pq("ol", pq($index))->size() == 0;
                            }); 
5)  is(expr)                pq("input[type='checkbox']")->parent()->is("form")
6)  map(callback)           pq("p")->append(pq("input").map(function(){
                              return pq(this)->val();
                            })->get()->join(", "));
7)  not(expr)               pq("p")->not(pq("#selected")[0])
8)  slice(start,[end])      pq("p")->slice(0, 1)->wrapInner("<b></b>");
9)  add(expr)               pq("p")->add("span")
10) children([expr])        pq("div")->children()
11) contents()              pq("p")->contents()->not("[@nodeType=1]").wrap("<b/>");
12) find(expr)              pq("p")->find("span")
13) next([expr])            pq("p")->next()
14) nextAll([expr])         pq("div:first")->nextAll()->addClass("after");
15) parent([expr])          pq("p")->parent()
16) parents([expr])         pq("span")->parents()
17) prev([expr])            pq("p").prev()
18) prevAll([expr])         pq("div:last")->prevAll()->addClass("before"); 
19) siblings([expr])        pq("div")->siblings()
20) andSelf()               pq("div")->find("p")->andSelf()->addClass("border");
21) end()                   pq("p")->find("span")->end()
 
\*文檔處理*\
1)  append(content)         pq("p")->append("<b>Hello</b>");
2)  appendTo(content)       pq("p")->appendTo("#foo");
3)  prepend(content)        pq("p")->prepend("<b>Hello</b>");
4)  prependTo(content)      pq("p")->prependTo("#foo");
5)  after(content)          pq("p")->after("<b>Hello</b>");
6)  before(content)         pq("p")->before("<b>Hello</b>");
7)  insertAfter(content)    pq("p")->insertAfter("#foo");
8)  insertBefore(content)   pq("p")->insertBefore("#foo");
9)  wrap(html)              pq("p")->wrap("<div class='wrap'></div>");
10) wrap(elem)              pq("p")->wrap(pq("#content"));
11) wrapAll(html)           pq("p")->wrapAll("<div></div>");
12) wrapAll(elem)           pq("p")->wrapAll(pq("#content")); 
13) wrapInner(html)         pq("p")->wrapInner("<b></b>");
14) wrapInner(elem)         pq("p")->wrapInner(pq(".content"));
15) replaceWith(content)    pq("p")->replaceWith("<b>Paragraph. </b>");
16) replaceAll(selector)    pq("<b>Paragraph. </b>")->replaceAll("p");
17) empty()                 pq("p")->empty();
18) remove([expr])          pq("p")->remove();
19) clone()                 pq("b")->clone()->prependTo("p");
20) clone(true)             pq("button")->clone(true)->insertAfter(pq("b"))

6 phpQuery連貫操作

pq()函數(shù)返回的結(jié)果是一個phpQuery對象蹬跃,可以對返回結(jié)果繼續(xù)進行后續(xù)的操作,例如:
pq('a')->attr('href', 'newVal')->removeClass('className')->html('newHtml')->...
詳情請查閱jQuery相關(guān)資料铆铆,用法基本一致蝶缀,只需要注意.與->的區(qū)別即可。

[測試 爬取簡單示例]

<?php
header("Content-Type: text/html;charset=utf-8"); 
require('phpQuery/phpQuery.php');
$eg1=phpQuery::newDocumentFile("http://www.whu.edu.cn/tzgg.htm");
$eg2=phpQuery::newDocumentFile("https://www.baidu.com/");
 
echo pq("title",$eg1)->html()."<br>";
echo pq("title",$eg1->getDocumentID())->html()."<br>";//$eg1與$eg1->getDocumentID()效果等同
echo pq("title")->html()."<br>";//就近匹配 $eg2
 
phpQuery::selectDocument($eg1); //默認(rèn)會使用選定的文檔
echo pq("title")->html()."<br>";
 
 
// $mes=pq("ul")->html();//獲取所有的ul標(biāo)簽中的html內(nèi)容
// echo $mes;
// echo "<br>___________________<br>";
// $mes=pq("ul,li")->html();//獲取所有的ul以及l(fā)i標(biāo)簽中的html內(nèi)容
// echo $mes;
 
// $t=pq("ul[class='article']")->html();//獲取ul class="article"的html內(nèi)容
// echo $t;
 
 
$t=pq("ul[class='article']>li:eq(2)")->html();//獲取ul class="article" 下第二個子元素li的html內(nèi)容
echo $t;
$t=pq("ul[class='article']>li:eq(2)>center>div:eq(1)")->html();
echo $t."<br>";
 
$t=pq("(ul[class='article']>li:eq(2)>center>div:eq(1))")->html();
echo $t."<br>";
$t=pq("(ul[class='article']>li:eq(3)>div[class='col-xs-12 col-sm-6 col-md-6']>a")->html();
echo $t."<br>";
 
$t=pq("(ul[class='article']>li:eq(3)>div[class='col-xs-12 col-sm-6 col-md-6']>a")->attr("href");
echo $t."<br>";
 
?>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薄货,一起剝皮案震驚了整個濱河市翁都,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谅猾,老刑警劉巖柄慰,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異税娜,居然都是意外死亡坐搔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門巧涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薯蝎,“玉大人,你說我怎么就攤上這事谤绳≌季猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵缩筛,是天一觀的道長消略。 經(jīng)常有香客問我,道長瞎抛,這世上最難降的妖魔是什么艺演? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮桐臊,結(jié)果婚禮上胎撤,老公的妹妹穿的比我還像新娘。我一直安慰自己断凶,他們只是感情好伤提,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著认烁,像睡著了一般肿男。 火紅的嫁衣襯著肌膚如雪介汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天舶沛,我揣著相機與錄音嘹承,去河邊找鬼。 笑死如庭,一個胖子當(dāng)著我的面吹牛叹卷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坪它,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼豪娜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哟楷?” 一聲冷哼從身側(cè)響起瘤载,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卖擅,沒想到半個月后鸣奔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡惩阶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年挎狸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断楷。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡锨匆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冬筒,到底是詐尸還是另有隱情恐锣,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布舞痰,位于F島的核電站土榴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏响牛。R本人自食惡果不足惜玷禽,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呀打。 院中可真熱鬧矢赁,春花似錦、人聲如沸贬丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘫寝。三九已至蜒蕾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焕阿,已是汗流浹背咪啡。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暮屡,地道東北人撤摸。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像褒纲,于是被迫代替她去往敵國和親准夷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容