php抓取網頁特定div區塊及圖片

昨天有個朋友在問我說,php怎麼抓取網頁某個div區塊的內容。像funp推推王那樣每次推文都會顯示文章內的圖片,提供縮圖撰擇,又是怎麼做到的?其實這語法出乎意料的簡短…
php抓取網頁特定div區塊及圖片

1. 取得指定網頁內的所有圖片測試

<?php
//取得指定位址的內容,並儲存至text
$text=file_get_contents('https://www.diimii.com/'); 

//取得所有img標籤,並儲存至二維陣列match
preg_match_all('#<img[^>]*>#i', $text, $match);

//印出match
print_r($match);
?>

2. 取得指定網頁內的第一張圖片測試

<?php
//取得指定位址的內容,並儲存至text
$text=file_get_contents('https://www.diimii.com/');

//取得第一個img標籤,並儲存至陣列match(regex語法與上述同義)
preg_match('/<img[^>]*>/Ui', $text, $match);

//印出match
print_r($match);
?>

3. 取得指定網頁內的特定div區塊(藉由id判斷)測試

<?php
//取得指定位址的內容,並儲存至text
$text=file_get_contents('https://www.diimii.com/2009/01/seo%e5%8c%96%e7%9a%84%e9%97%9c%e9%8d%b5%e5%ad%97%e5%bb%a3%e5%91%8a%e9%80%a3%e7%b5%90/'); 

//去除換行及空白字元(序列化內容才需使用)
//$text=str_replace(array("\\r","\\n","\\t","\\s"), '', $text);   

//取出div標籤且id為PostContent的內容,並儲存至陣列match
preg_match('/<div[^>]*id="PostContent"[^>]*>(.*?) <\\/div>/si',$text,$match);

//印出match[0]
print($match[0]);
?>

4. 上述2及3的結合測試

<?php
//取得指定位址的內容,並儲存至text   
$text=file_get_contents('https://www.diimii.com/2009/01/seo%e5%8c%96%e7%9a%84%e9%97%9c%e9%8d%b5%e5%ad%97%e5%bb%a3%e5%91%8a%e9%80%a3%e7%b5%90/');    
  
//取出div標籤且id為PostContent的內容,並儲存至陣列match   
preg_match('/<div[^>]*id="PostContent"[^>]*>(.*?) <\\/div>/si',$text,$match);   

//取得第一個img標籤,並儲存至陣列match2
preg_match('/<img[^>]*>/Ui', $match[0], $match2); 
  
//印出match2[0]   
print_r($match2[0]); 
?>

後記:用正規表達式Regex來做真的很方便,但老實說我規則常會忘掉,記錄一下幾篇文章好了(Regular Expression Details | PCRE Functions | Introduction to PHP Regex | 天殺的正規表示式…

參考:Fetching the contents of a div tag by id

您可能也會喜歡…

21 個回應

  1. kenneth表示:

    喔喔原來是這樣啊~~~

  2. 感謝你表示:

    感謝你 對我有很大幫助
    等我成名我會來報答你給你錢
    愛死擬了

  3. ANDY表示:

    有幫上忙就好(但你的網址和mail都亂填T_T)

  4. star表示:

    請問一下!
    這四個步驟中的正規表達式,
    步驟二其中一開始的”/” 和結束的 “/Ui”是什意思阿?

  5. ANDY表示:

    斜線/和斜線的U和i是使用PCRE模式的修飾字,旨在取得斜線內的一個匹配字符,而不是多個,可參考這篇文章
    http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

  6. star表示:

    感謝~
    後來我也找到這個頁面!
    了解怎麼運用preg系列函式的修飾字了!

  7. ANDY表示:

    不客氣

  8. Neil表示:

    您好!!!這幾天這問題困擾我很久.一直在嚐試中.希望版主可以幫忙解答

    請問要如何從下列字串篩檢出111.222.333.444.555,666,777,888,999,000????

    字串————————————–

    111
    222
    333
    444
    555

    666
    777
    888
    999
    000

    字串————————————–

  9. ANDY表示:

    TO:Neil
    不好意思晚回覆了,看來已有人幫你^^

  10. ME表示:

    請問第一題 1. 取得指定網頁內的所有圖片 此處[^>]的意思是?? 感謝ANDY版大的回答 ^^

  11. ANDY表示:

    To: ME
    /<img[^>]*>/
    以<img為起始,中間所有符合不為>的所有字串,再以>做結尾
    (正規式很難用中文解釋耶T_T)

  12. TC表示:

    請問要如何抓第二頁的資料呢?
    ex 第一頁跟第二頁網址都一樣 但是都抓到第一頁的

  13. Mike表示:

    請問要如何抓第二頁的資料呢
    但是第一頁網址跟第二頁的一樣

  14. 桀傲不馴表示:

    站主請教一下
    取得指定網頁內的特定div區塊(藉由id判斷)
    如果該網頁圖片使用”相對路徑”的話就抓不到正確路徑
    不知有何解決方法
    感謝指導喔^^

  15. Aiolus表示:

    Regex對img很有效 可是對div中包div這個就會有點bug
    content
    這樣可能讀不到content…

  16. 紅茶表示:

    感覺還蠻實用的唷~~可以省去很多作業時間呢~~只是要寫出更適合自己的工作的語法就要花時間想架構囉~~QQ

  17. 歪歪表示:

    請問一下這個抓取網頁的成是只能抓取div的物件嗎??
    其他的可以嗎?
    可以的話要怎麼寫??

  18. Gary表示:

    請問 這個方法好像對FB沒有作用喔
    還有其他方式可以抓取FB的圖片嗎?

  19. snow表示:

    請問在
    preg_match(‘/]*id=”PostContent”[^>]*>(.*?) /si’,$text,$match);
    中的那條\是什麼意思??麻煩您了 謝謝

  20. XD表示:

    版大你好,如果想讀取一個區域的公告該怎麼做呢?0.0

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *