XPath di PHP untuk mendapatkan data di halaman web

Tantangan hari ini adalah XPath, Jadi pada suatu hari ada sebuah kasus dimana PHP script harus menangkap informasi di berbagai halaman web.

Yang menjadi masalah adalah halaman web bisa diformat dalam struktur yang bermacam-macam, kita membutuhkan cara membaca yang mudah, portable dan bisa disesuaikan.

XPath

XPath adalah syntax untuk mendeskripsikan lokasi dari elemen XML (makanya disebut PATH), jadi dengan mengetahui XPath tertentu kamu bisa melompat ke bagian tertentu dari dokumen XML dan mendapatkan nilainya.

Misal ada XML dokumen berbentu seperti ini:


        Nilai

Dengan XPath sederhana seperti

//node/elemen/anak

kita bisa mendapatkan isinya node dengan hanya mengetahui XPathnya (jadi tidak perlu iterasi per-node), konsepnya sih mirip dengan Pathnya folder structure.

Misalnya

/html/body

Akan mengembalikan seluruh node didalam “body”

Mirip juga dengan JQuery loh, misalnya

//div[@id="one"]

Akan mengembalikan node div dimanapun yang memiliki id “one”

/html/body/div[5]

Akan mengembalikan div ke-5 yang merupakan anak dari body

Untuk info lebih lanjut mengenai XPath bisa lihat disini
W3School Xpath

XPath in PHP

Di PHP kita bisa menggunakan DOMDocument atau simpleXML untuk melakukan query XPath.

Misalnya ada source HTML seperti ini

<html>
<head><title>Hai</title></head>
<body>
<h1>Produk Keren</h1>
<div id="warna">Merah</div>
<div id="price">Rp 3000</div>
<div id="deskripsi">Produk super keren!</div>
</body>

Kodenya sendiri mudah saja… misalnya teks diatas kita masukan ke variabel $content

// inisialisasi DOMnya, siapin objek bertipe DOMXPath
$html = new DOMDocument();
$html->loadHtml($content);
$xpath = new DOMXPath( $html );

// 1. mendapatkan judul dari halaman
$nodes = $xpath ->query('/html/head/title');
echo $nodes->item(0)->nodeValue;

//2. mendapatkan nama produk
$nodes = $xpath ->query('/html/body/h1');
echo $nodes->item(0)->nodeValue;

//3. mendapatkan harga
$nodes = $xpath ->query('//div[@id="price"]');
echo $nodes->item(0)->nodeValue;

//3. mendapatkan harga (incase HTMLnya tidak memiliki atribut
//    jadi kita menggunakan posisi sebagai acuan)
$nodes = $xpath ->query('/html/body/div[2]');
echo $nodes->item(0)->nodeValue;

Perlu diingat kalau metoda “query” akan selalu mengembalikan list of nodes (jika gagal dia akan mengembalikan list of nodes dengan length = 0)

Conclusion

Yang membuat XPath ini spesial adalah, kamu bisa menyimpannya sebagai string, misalnya program kamu mesti membaca bagian tertentu dari sebuah Site, tapi tiba2 site itu merubah desain layoutnya. Kamu tinggal mengubah lokasi XPath kamu (in which configurable bukan?)

Happy XPath-ing…

Advertisements

6 comments

  1. rhezashan · December 8, 2015

    Mantap gan, kalo bisa ksh tutorial xpath lanjutan, kalo dibandingkan dengan simple html dom parser gimana gan?

    • Eru · December 16, 2015

      Wah uda bertahun-tahun ga pakai Xpath di PHP, untuk scrapping lebih banyak pakai `cheerio` atau `casperjs` malah sekarang 🙂

      • rhezashan · December 16, 2015

        Sy udah nyobain simple htmlDOM, looping nya ada sampe 5000 data, tiap hari memory di server nya bertambah terus meskipun sudah di unset($html) atau $html->clear, tar saya cobain casperjs. Hehe

      • Eru · December 17, 2015

        Nah itu, salah satunya kalau use-casenya uda gede – tend to memory leak. Uda coba `$html->clear()` sebelum unset?

  2. rhezashan · December 8, 2015

    Mantap gan, kalo dibandingkan dengan simple html dom parser mudahan mana gan?

    • Eru · December 16, 2015

      SimpleDOM parser butuh banyak iterasi, kalau struktur yang mau diparse cenderung statis pakai XPath bisa lebih to the point

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s