เขียนโปรแกรมด้วย PHP DOM เพื่อดึงข้อมูลจากไฟล์ HTML

ได้รับข้อมูลในรูปแบบไฟล์ HTML เพื่อให้ดึงค่าจากบางฟิลด์ (field) ออกมา ใช้ในการทำรายงาน

ในตอนแรกลองเขียนโปรแกรม PHP ขึ้นมาเอง โดยใช้ Regular Expression ทำไปซักพัก เริ่มยากขึ้น เหตุเพราะรูปแบบอันหลากหลายของไฟล์ HTML ไม่ว่าจะเป็นตัวอักษรพิมพ์ใหญ่เล็ก การเรียงลำดับ tag การเว้นวรรค

พบวิธีการดึงข้อมูลโดยใช้ PHP DOM ง่ายขึ้นเยอะ เลยนำมาแชร์เล่าสู่กันฟัง

ตัวอย่างไฟล์ test.html เพื่อจะดึงข้อมูล

$ cat test.html

<html>
<head>
<title>My Page</title>
</head>
<body>
<table>
 <tr>
  <td id="head_id">Id</td>
  <td id="head_name">Name</td>
 </tr>
 <tr>
  <td id="data_id1"><a href="view.php?id=1">1</a></td>
  <td id="data_name1">Alice</td>
 </tr>
 <tr>
  <td id="data_id2"><a href="view.php?id=2">2</a></td>
  <td id="data_name2">Bob</td>
 </tr>
 <tr>
  <td id="data_id3"><a href="view.php?id=3">3</a></td>
  <td id="data_name3">Carl</td>
 </tr>
</table>
</body>
</html>

เริ่มต้นโหลดไฟล์ html ด้วย php dom

เขียนไฟล์ php เริ่มต้นโหลดไฟล์ html

<?php
$html = new DOMDocument();
$html->loadHTMLFile('test.html');
var_dump($html);
?>

คำอธิบาย

  • สร้าง object จาก class ชื่อ DOMDocument ตั้งไว้เป็นตัวแปรชื่อ $html
  • เรียก method ชื่อ loadHTMLFile เพื่อโหลดไฟล์ HTML ที่ต้องการดึงข้อมูล (parse)

ทดลองรันโปรแกรม

$ php parse-dom.php
PHP Fatal error:  Class 'DOMDocument' not found in /var/www/html/php/dom/parse-dom.php on line 3
$

รันแล้ว error แบบนี้ เพราะว่าไม่มี php module ที่ชื่อ dom

ต้องติดตั้ง extension ชื่อ libxml เพิ่มเติม ทำได้สองแบบ

หากคอมไพล์ php เอง ต้อง คอมไพล์ใหม่ด้วยการระบุออปชั่น –enable-libxml เพิ่มเติมตอนรัน configure

แต่ถ้าติดตั้ง php จาก rpm บน Fedora, RedHat หรือ CentOS ต้องติดตั้งไฟล์ php-xml เพิ่มเติม

ตัวอย่างติดตั้ง rpm เพิ่มเติม บน CentOS 5.5 (updates)

[root@web updates]# rpm -ivh php53-xml-5.3.3-1.el5.x86_64.rpm
Preparing...                ########################################### [100%]
   1:php53-xml              ########################################### [100%]

รัน php ด้วยออปชั่น -m เพื่อดู  module ที่เพิ่มขึ้นมา

$ php -m
...
dom
wddx
xmlreader
xmlwriter
xsl

ทดลองรันโปรแกรมอีกครั้ง

$ php parse-dom.php
object(DOMDocument)#1 (0) {
}

ดึงข้อมูลตาม html tag ที่ต้องการ

ทำได้โดยง่ายด้วย method ชื่อ getElementsByTagName() ระบุชื่อ tag ที่ต้องการค้นหา

ตัวอย่าง ต้องการดึงข้อมูลที่อยู่ใน tag “td” หรือระหว่าง <td></td>

<?php
$html = new DOMDocument();
$html->loadHTMLFile('test.html');
$tds = $html->getElementsByTagName('td');
foreach ($tds as $td) {
    print $td->nodeValue . "\n";
}
?>

ทดลองรันโปรแกรม จะเห็นผลลัพธ์ที่ได้

$ php parse-dom.php
Id
Name
1
Alice
2
Bob
3
Carl

ดึงข้อมูลตาม id ในไฟล์ html ที่ต้องการ

ทำได้โดยใช้ method ชื่อ getElementById() ระบุ id ที่ต้องการค้นหา

ตัวอย่าง ต้องการดึงข้อมูลที่อยู่ใน tag ที่ระบุด้วย id “data_name2”

<?php
$html = new DOMDocument();
$html->loadHTMLFile('test.html');
$id2 = $html->getElementById('data_name2');
print $id2->nodeValue . "\n";
?>

ทดลองรันโปรแกรม จะเห็นผลลัพธ์ที่ได้

$ php parse-dom.php
Bob

ลองนำไปต่อยอด พัฒนากันต่อครับ

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.