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à tôi muốn giới thiệu đến chính 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?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;
?>
|
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)
1
2
3
4
5
6
7
8
|
// 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.c) Truy xuất đến thuộc tính của đối tượng
1
2
3
4
5
6
7
8
9
10
|
// 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>';
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<?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;
}
?>
|
Chúc các bạn làm việc hiệu quả với thư viện này. Thân ái!