iT邦幫忙

1

如何以php抓取html文件的特定元素,並且依照抓取順序填入頁碼

  • 分享至 

  • xImage

公司丟來難題,要我給每一個特定的html元素填入頁碼。完整html結構如下(已簡化文字段落並整理3組提供參考),

<!DOCTYPE html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <section>
        <!-- 頁碼-->
            <a class="fl1 page" name="" href="#">
                <div style="color: gray;"></div>
            </a>
        <!-- 段落-->
            <article class="fl1">
                <div class="sm1"></div>
                <div class="paragraph indent_2">
                    <span class="w500">早安 台灣</span>
                </div>
            </article>
        <!-- 頁碼-->
            <a class="fl1 page" name="" href="#">
                <div style="color: gray;"></div>
            </a>
        <!-- 段落-->
            <article class="fl1">
                <div class="sm1"></div>
                <div class="paragraph indent_2">
                    <span class="w500">早安 台北</span>
                </div>
            </article>
        <!-- 頁碼-->
            <a class="fl1 page" name="" href="#">
                <div style="color: gray;"></div>
            </a>
        <!-- 段落-->
            <article class="fl1">
                <div class="sm1"></div>
                <div class="paragraph indent_2">
                    <span class="w500">早安 高雄</span>
                </div>
            </article>
        </section>
    </body>
</html>

我要利用php快速處理這個主題。請各位先進看圖

https://ithelp.ithome.com.tw/upload/images/20241113/20153440HruBxgGgcE.png

https://ithelp.ithome.com.tw/upload/images/20241113/201534406IruR3bF3j.png

php抓取html檔案全部的特定元素,例如有1253組,通通填上頁碼之後,將新且完整的html輸出到螢幕並且存檔。
請教這怎麼做,感恩了

ccutmis iT邦高手 2 級 ‧ 2024-11-13 09:01:03 檢舉
改用 python 會不會比較簡單省事?
Ex: 把所有htm放到一個資料夾,然後用os.listdir列出所有.htm,
再用一個廻圈依序讀取.htm內容,然後用 regExp置換你要處理的部份,
最後存檔並將處理結果 print 的螢幕上,End
淺水員 iT邦大師 6 級 ‧ 2024-11-13 09:41:27 檢舉
能用 javascript 丟給瀏覽器處理嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
froce
iT邦大師 1 級 ‧ 2024-11-13 09:43:18
最佳解答

在頁面加段JS不就好了,應該不用跨檔案去處理吧?

const elms = document.querySelectorAll(".fl1")

Array.from(elms).map((e, i)=>{
  e.setAttribute("name", i+1)
  e.querySelector("div").innerText = `${i+1}頁`
})

https://jsbin.com/liqeyewiki/edit?html,js,output

rosef35 iT邦新手 4 級 ‧ 2024-11-13 11:55:33 檢舉

的確,我決定改以js處理,然後在ajax給後台

2

首先,個人並不太建議用PHP來直接整理輸出html碼。
最好還是利用一下 js 處理。

但如果情況不允許非得用PHP來輸出 html 碼的情況下。
一般來說,我會建議使用正則來區分取代
以下程式給你參考(我沒試驗過,自已試試看)

<?php
$html = '
<a class="fl1 page" name="" href="#">
    <div style="color: gray;"></div>
</a>
<a class="fl1 page" name="" href="#">
    <div style="color: gray;"></div>
</a>
<a class="fl1 page" name="" href="#">
    <div style="color: gray;"></div>
</a>
'; //這裏是您的html碼。

// 使用 preg_replace_callback() 來處理每個匹配的 <a> 標籤
$count = 1;
$html = preg_replace_callback(
    '/<a\s+class="fl1\s+page"\s+name=""\s+href="#">\s*<div\s+style="color:\s*gray;">\s*<\/div>\s*<\/a>/',
    function($matches) use (&$count) {
        // 在每個匹配項中,按順序替換 name 屬性和 div 內容
        $new_a = '<a class="fl1 page" name="p' . $count . '" href="#">' .
                 '<div style="color: gray;">' . $count . '頁</div>' .
                 '</a>';
        $count++;
        return $new_a;
    },
    $html
);

echo $html;
?>
rosef35 iT邦新手 4 級 ‧ 2024-11-13 11:55:53 檢舉

的確,我決定改以js處理,然後在ajax給後台

我要發表回答

立即登入回答