PHP: Lấy nội dung của các phần tử trang với PHP
Bài viết này sẽ giới thiệu đến các bạn một thư viện PHP dùng để lấy nội dung của các phần tử trang.
Hiểu nôm na là một trang web có các phần tử khác nhau và bạn muốn lấy nội dung của 1 phần tử nào đó, chẳng hạn một table, thì chúng ta có thể dùng jQuery hay cURL để lấy nhưng với thư viện dưới đây, mọi chuyện sẽ trở nên đơn giản hơn.
Thư viện mà ta sẽ sử dụng là PHP Simple HTML DOM Parser. Đây là một thư viện được đánh giá khá cao với những tính năng hữu ích, đặc biệt là khả năng parser dữ liệu rất tốt. Các bạn có thể download tại đây.
1. Cách sử dụng
Cách sử dụng của thư viện này tương đối dễ dàng, nếu bạn nào quen với jQuery sẽ nắm bắt thư viện này nhanh hơn. Dưới đây là một ví dụ dễ hiểu để các bạn làm quen.
<?php // Thêm thư viện include('../simple_html_dom.php'); // Lấy cấu trúc trang (DOM) từ URL hoặc file $html = file_get_html('http://www.google.com/'); // Tìm tất cả link foreach($html->find('a') as $e) echo $e->href . '<br>'; // Tìm tất cả link hình ảnh có trong trang web (thuộc tính src) foreach($html->find('img') as $e) echo $e->src . '<br>'; // Tìm tất cả thẻ ảnh (bao gồm luôn tag <img>) foreach($html->find('img') as $e) echo $e->outertext . '<br>'; // Tìm tất cả thẻ div mà có id=gbar foreach($html->find('div#gbar') as $e) echo $e->innertext . '<br>'; // Tìm tất cả thẻ span mà có class=gb1 foreach($html->find('span.gb1') as $e) echo $e->outertext . '<br>'; // Tìm tất cả thẻ td mà có thuộc tính align=center foreach($html->find('td[align=center]') as $e) echo $e->innertext . '<br>'; // In nội dung có trong thẻ td đầu tiên mà có thuộc tính align=center echo $html->find('td[align="center"]', 1)->plaintext.'<br><hr>'; // In toàn bộ nội dung có trong trang web (chỉ có text, không có các thẻ tag) echo $html->plaintext; ?>
Sau khi tải thư viện này về, giải nén thư mục, các bạn sẽ tìm thấy rất nhiều ví dụ từ đơn giản đến phức tạp khi sử dụng thư viện này.
2. Các phương thức (hàm) chính
Sau khi tìm hiểu và làm quen với vài ví dụ, tôi nhận thấy có các phương thức (hàm) chính sau đây:
a. Tạo đối tượng phần tử trang (DOM)
// Create a DOM object from a string $html = str_get_html('<html><body>Hello!</body></html>'); // Create a DOM object from a URL $html = file_get_html('http://www.google.com/'); // Create a DOM object from a HTML file $html = file_get_html('test.htm');
b. Tìm kiếm phần tử (phương thức quan trọng nhất)
Đó là hàm find(), chức năng và cú pháp tương tự như hàm find() trong jQuery. Bạn có thể tìm tất cả các thẻ hoặc từng thẻ riêng biệt với những tham số thích hợp.
// Find all anchors, returns a array of element objects $ret = $html->find('a'); // Find (N)th anchor, returns element object or null if not found (zero based) $ret = $html->find('a', 0); // Find lastest anchor, returns element object or null if not found (zero based) $ret = $html->find('a', -1); // Find all <div> with the id attribute $ret = $html->find('div[id]'); // Find all <div> which attribute id=foo $ret = $html->find('div[id=foo]'); // Descendant selector $str = <<<HTML <div> <div> <div class="foo bar">ok</div> </div> </div> HTML; $html = str_get_html($str); echo $html->find('div div div', 0)->innertext . '<br>'; // result: "ok" // Nested selector $str = <<<HTML <ul id="ul1"> <li>item:<span>1</span></li> <li>item:<span>2</span></li> </ul> <ul id="ul2"> <li>item:<span>3</span></li> <li>item:<span>4</span></li> </ul> HTML; $html = str_get_html($str); foreach($html->find('ul') as $ul) { foreach($ul->find('li') as $li) echo $li->innertext . '<br>'; } // Parsing checkbox $str = <<<HTML <form name="form1" method="post" action=""> <input type="checkbox" name="checkbox1" value="checkbox1" checked>item1<br> <input type="checkbox" name="checkbox2" value="checkbox2">item2<br> <input type="checkbox" name="checkbox3" value="checkbox3" checked>item3<br> </form> HTML; $html = str_get_html($str); foreach($html->find('input[type=checkbox]') as $checkbox) { if ($checkbox->checked) echo $checkbox->name . ' is checked<br>'; else echo $checkbox->name . ' is not checked<br>'; }
c. Truy xuất đến thuộc tính của đối tượng
// Create DOM from URL or file $html = file_get_html('http://www.google.com/'); // Find all images foreach($html->find('img') as $element) echo $element->src . '<br>'; // Find all links foreach($html->find('a') as $element) echo $element->href . '<br>';
Với ví dụ trên các bạn có thể thấy chúng ta hoàn toàn lấy được các thuộc tính của đối tượng (sau khi đã được tìm kiếm) như thẻ <a href=””></a> thì chứa thuộc tính href hay thẻ <img src=”” /> có chứa thuộc tính src…
d. Đọc nội dung phần tử trang
- plaintext : Lấy nội dung (text) từ trang web
- innertext : Chỉ lấy nội dung bên trong thẻ (tag), tương tự như hàm text() trong jQuery.
- outertext : Lấy cả thẻ và nội dung bên trong, tương thự như hàm html() trong jQuery.
e. Thao tác với các phần tử trang web
Với sự linh hoạt của các tính năng trên, bạn có thể thao tác với nội dung từng phần tử hoặc cả trang web với ví dụ dưới đây:
<?php include_once('../simple_html_dom.php'); // ----------------------------------------------------------------------------- // remove HTML comments function html_no_comment($url) { // create HTML DOM $html = file_get_html($url); // remove all comment elements foreach($html->find('comment') as $e) $e->outertext = ''; $ret = $html->save(); // clean up memory $html->clear(); unset($html); return $ret; } // ----------------------------------------------------------------------------- // search elements that contains an specific text function find_contains($html, $selector, $keyword, $index=-1) { $ret = array(); foreach ($html->find($selector) as $e) { if (strpos($e->innertext, $keyword)!==false) $ret[] = $e; } if ($index<0) return $ret; return (isset($ret[$index])) ? $ret[$index] : null; } ?>