[PHP] Lấy nội dung của các phần tử trang

Thời gian vừa qua tôi khá bận nên cũng ít có bài viết mới trên Blog này, nay công việc cũng đã tạm ổn nên tôi sẽ dành nhiều thời gian chăm chút cho Blog hơn. Và trong bài viết hôm nay tôi 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à 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

<?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;
?>

Các bạn thấy thế nào? Cũng khá dễ hiểu đó chứ. 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;
}
?>

 

Chúc các bạn làm việc hiệu quả với thư viện này. Thân ái!

Tấn Việt

Tôi lập trang web này để thỏa mãn sở thích viết cái gì đó vui vui khi rãnh rỗi và đồng thời cũng chia sẻ những gì tôi biết hoặc đọc đâu đó trên mạng về Lập trình web. Tôi hi vọng những bài viết này sẽ giúp ích cho các bạn. Thân ái!

You may also like…

6 Responses

  1. says:

    mình có link blog này : http://blogmuathu.tk/blog/5/trung-thu-c%E1%BB%A7a-m%E1%BA%B9/
    mình muốn get ảnh đầu tiên từ bài viết này thù dùng hàm như thế nào ban?

  2. Hoang says:

    Cậu cho mình hỏi mình code nhưng không có phương thức find và href

  3. Ncn says:

    Bài viết rất hay.
    Hổm rày đọc truyện chữ trên mạng ở các diễn đàn mà phải online liên tục, giờ có mới data này code lại down về đọc off rất tiện lợi.

  4. Hiep says:

    bài viết của bạn hay lắm,,đúng cái mình cần,,và mình hỏi 1 chút,,ví dụ trang web mà mình cần lấy có đoạn html như sau

    name : Trần Đoàn Hiệp

    giờ mình cần lấy chuỗi ‘Trần Đoàn Hiệp’ kia thì làm thế nào ạ…mình thử dùng plaintext,innertext,outertext..nhưng nó chỉ lấy cho mình chuỗi ‘name’ chứ ko phải là ”Trần Đoàn Hiệp”..ngoài 3 cái thuộc tính plaintext,innertext,outertext này ra còn thuộc tính nào để lấy text mà nằm ngoài thẻ không ạ

    • Phú says:

      Bạn có thể ấn chuột phải vào “Trần Đoàn Hiệp” và chọn kiểm tra phần tử để xem tag html nào đang chứa nó và có id hoặc class là gì, từ đó bạn sẽ đưa vào trong find để tìm kiếm được chính xác

  5. Minh Clear says:

    Hình nhu simple html dom ko lấy dữ liệu nếu web đó lấy dữ liệu bằng ajax phải ko admin