Trang

Thứ Năm, 18 tháng 7, 2013

Lấy dữ liệu từ trang HTML - HTML DOM [PHP]

I. DOM là gì?

DOM (Document Object Model) – tạm dịch: mô hình đối tượng của tài liệu: nói rõ hơn là W3C DOM, là 1 dạng chuẩn của W3C đưa ra nhằm để truy xuất và thao tác dữ liệu của tài liệu có cấu trúc (vd như: HTML, XML), và mô hình này thể hiện tài liệu(document) dưới dạng cấu trúc cây phân cấp.


Nó còn được phân làm 3 nhánh nhỏ nữa:
- Core DOM: dạng chuẩn để thao tác và truy xuất tài liệu có cấu trúc.
- HTML DOM: dạng chuẩn để thao tác và truy xuất tài liệu HTML.
- XML DOM: dạng chuẩn để thao tác và truy xuất tài liệu XML.

Ngoài ra, DOM còn định nghĩa các đối tượng, phương thức và thuộc tính để chúng ta có thể truy xuất và thao tác từng phần tử của tài liệu (như XML, HTML).

II. HTML DOM

HTML DOM viết tắt của Document Object Model for HTML

HTML DOM định nghĩa tập các đối tượng chuẩn cho HTML, và cách tiêu chuẩn truy xuất và xử lý tài liệu HTML

HTML DOM xem tài liệu HTML như một cấu trúc dạng cây của các thành phần (element) nhúng trong các thành phần khác. Các thành phần chứa văn bản và các thuộc tính có thể truy xuất qua DOM tree. Nội dung của nó có thể xóa hoặc thay đổi, và thành phần mới có thể tạo bằng DOM. Các thành phần, văn bản của nó, và các thuộc tính được gọi là nút (node).

III. Sử dụng HTML DOM

Trước khi sử dụng, phải download thư viện HTML DOM.
Download:
Mediafire hoặc vupham999@gmail.com, vuphamluutru999@gmail.com

Sau khi download xong, muốn sử dụng ta phải require file simple_html_dom.php vào project của mình

1. Quick start

a. Get HTML elements

// 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>';

b. Modify HTML DOM

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

2. How to create HTML DOM object?

// 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');


3. How to find HTML elements?

a. Basics

// 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]');

b. Advanced

// Find all element which id=foo
$ret = $html->find('#foo');

// Find all element which class=foo
$ret = $html->find('.foo');

// Find all element has attribute id
$ret = $html->find('*[id]');

// Find all anchors and images
$ret = $html->find('a, img');

// Find all anchors and images with the "title" attribute
$ret = $html->find('a[title], img[title]');

c. Descendant selector (lựa chọn dựa trên quan hệ con cháu)

// Find all <li> in <ul>
$es = $html->find('ul li');

// Find Nested <div> tags
$es = $html->find('div div div');

// Find all <td> in <table> which class="hello"
$es = $html->find('table.hello td');

// Find all td tags with attribite align=center in table tags
$es = $html->find(''table td[align=center]');

// Find all <li> in <ul>
foreach($html->find('ul') as $ul)
{
       foreach($ul->find('li') as $li)
       {
             // do something...
       }
}

// Find first <li> in first <ul>
$e = $html->find('ul', 0)->find('li', 0);

4. How to access the HTML element's attributes?

a. Get, Set, and Remove Attributes

// Get a attribute ( If the attribute is non-value attribute (eg. checked, selected...), it will returns true or false)
$value = $e->href;

// Set a attribute(If the attribute is non-value attribute (eg. checked, selected...), set it's value as true or false)
$e->href = 'my link';

// Remove a attribute, set it's value as null!
$e->href = null;

// Determine whether a attribute exist?
if(isset($e->href))
        echo 'href exist!';

b. Magic Attributes

// Example
$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);

echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"


Attribute Name Usage
$e->tag Read or write the tag name of element.
$e->outertext Read or write the outer HTML text of element.
$e->innertext Read or write the inner HTML text of element.
$e->plaintext Read or write the plain text of element.

c. Tips

// Extract contents from HTML
echo $html->plaintext;

// Wrap a element
$e->outertext = '<div class="wrap">' . $e->outertext . '<div>';

// Remove a element, set it's outertext as an empty string
$e->outertext = '';

// Append a element
$e->outertext = $e->outertext . '<div>foo<div>';

// Insert a element
$e->outertext = '<div>foo<div>' . $e->outertext;

5. How to traverse the DOM tree?

// Example
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// or
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');




6. Callback functions

// Write a function with parameter "$element"
function my_callback($element) {
        // Hide all <b> tags
        if ($element->tag=='b')
                $element->outertext = '';
}

// Register the callback function with it's function name
$html->set_callback('my_callback');

// Callback function will be invoked while dumping
echo $html;

Nguồn: Sưu tầm Internet

Không có nhận xét nào:

Đăng nhận xét