Nếu bạn cần phải phân tích HTML, biểu thức thông thường không phải là con đường để đi. Trong hướng dẫn này, bạn sẽ học cách sử dụng một mã nguồn mở, dễ dàng học được phân tích cú pháp , đọc, chỉnh sửa, và nhổ lại ra HTML từ các nguồn bên ngoài. Sử dụng nettuts làm ví dụ, bạn sẽ học cách để có được một danh sách tất cả các bài viết đăng tải trên trang web và hiển thị chúng.
Điều đầu tiên bạn sẽ cần phải làm là tải về một bản sao của thư viện simpleHTMLdom, cung cấp miễn phí từ SourceForge.
Có một số tập tin trong việc tải xuống, nhưng là người duy nhất bạn cần là file simple_html_dom.php; phần còn lại là những ví dụ và tài liệu hướng dẫn.
Bước 2. Phân tích cơ bản
Thư viện này là rất dễ sử dụng, nhưng có một số điều cơ bản bạn nên xem xét trước khi đưa nó vào hành động.
Bạn có thể tạo đối tượng ban đầu của bạn bằng cách tải HTML từ một chuỗi, hoặc từ một tập tin. Tải một tập tin có thể được thực hiện hoặc thông qua URL, hoặc thông qua hệ thống tập tin địa phương của bạn.
Một lưu ý thận trọng: Các load_file () phương pháp đại biểu công việc của mình để đào tạo Quản lý của PHP. Nếu allow_url_fopen không được thiết lập là true trong file php.ini của bạn, bạn có thể không có khả năng để mở một tập tin từ xa theo cách này. Bạn luôn có thể rơi trở lại vào thư viện CURL để tải các trang từ xa trong trường hợp này, sau đó đọc chúng với phương pháp load ().
Thông tin truy cập
Một khi bạn có đối tượng DOM, bạn có thể bắt đầu làm việc với nó bằng cách sử dụng find () và tạo ra bộ sưu tập. Một bộ sưu tập là một nhóm đối tượng tìm thấy qua một selector - cú pháp là khá giống với jQuery.
1
2
3
4
5
6
<html>
<body>
<p>Hello World!</p>
<p>We're Here.</p>
</body>
</html>
Trong ví dụ này HTML, chúng ta sẽ có một cái nhìn như thế nào để truy cập thông tin trong đoạn thứ hai, thay đổi nó, và sau đó xuất kết quả.
# get an element representing the second paragraph
$element= $html->find("p");
# modify it
$element[1]->innertext .= " and we're here to stay.";
# output it!
echo$html->save();
Sử dụng find () phương pháp luôn luôn trả về một bộ sưu tập (mảng) của thẻ, trừ khi bạn xác định rằng bạn chỉ muốn đứa trẻ thứ n, như một tham số thứ hai.
Dòng 2-4 : Nạp HTML từ một chuỗi, như được giải thích trước đó.
Dòng 7 : Dòng này tìm tất cả <p> thẻ trong HTML, và trả về họ như một mảng. Đoạn đầu tiên sẽ có một chỉ số từ 0, và đoạn văn bản tiếp theo sẽ được lập chỉ mục cho phù hợp.
dòng 10 : Đây truy cập vào mục thứ 2 trong bộ sưu tập của đoạn văn của chúng tôi (chỉ số 1), và làm cho một bổ sung cho thuộc tính innerText của nó. InnerText đại diện cho nội dung giữa các thẻ, trong khi outertext đại diện cho các nội dung bao gồm các thẻ. Chúng ta có thể thay thế thẻ hoàn toàn bằng cách sử dụng outertext.
Chúng ta sẽ thêm một dòng, và sửa đổi các loại thẻ đoạn thứ hai của chúng tôi.
1
2
$element[1]->class= "class_name";
echo$html->save();
HTML kết quả của tiết kiệm lệnh sẽ là:
1
2
3
4
5
6
<html>
<body>
<p>Hello World!</p>
<pclass="class_name">We're here and we're here to stay.</p>
</body>
</html>
Selectors khác
Dưới đây là một số ví dụ khác về bộ chọn. Nếu bạn đã sử dụng jQuery, chúng sẽ có vẻ rất quen thuộc.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
# get the first occurrence of id="foo"
$single= $html->find('#foo', 0);
# get all elements with class="foo"
$collection= $html->find('.foo');
# get all the anchor tags on a page
$collection= $html->find('a');
# get all anchor tags that are inside H1 tags
$collection= $html->find('h1 a');
# get all img tags with a title of 'himom'
$collection= $html->find('img[title=himom]');
Ví dụ đầu tiên là không hoàn toàn trực quan - tất cả các truy vấn bằng bộ sưu tập trở lại mặc định, thậm chí là một truy vấn ID, mà chỉ nên trả về một kết quả duy nhất. Tuy nhiên, bằng cách xác định tham số thứ hai, chúng tôi đang nói "chỉ trả lại mục đầu tiên của bộ sưu tập này".
Điều này có nghĩa $ duy nhất là một yếu tố duy nhất, chứ không phải sau đó một loạt các yếu tố với một mục.
Phần còn lại trong những ví dụ là tự giải thích.
Tài liệu
Tài liệu hướng dẫn đầy đủ về thư viện có thể được tìm thấy tại trang tài liệu dự án .
Bước 3. Real World Ví dụ
Để đặt thư viện này trong hành động, chúng ta sẽ viết một kịch bản nhanh chóng để cạo các nội dung của trang web nettuts, và tạo ra một danh sách các bài trình bày trên trang web theo tiêu đề và mô tả .... chỉ là một ví dụ. Nạo là một lĩnh vực phức tạp của trang web, và không nên được thực hiện mà không được phép.
Chúng ta bắt đầu bằng cách bao gồm thư viện, và gọi getArticles chức năng với trang chúng tôi muốn bắt đầu phân tích cú pháp. Trong trường hợp này, chúng tôi đang bắt đầu gần cuối và tử tế với máy chủ nettuts'.
Chúng tôi cũng tuyên bố một mảng toàn cầu để làm cho nó đơn giản để thu thập tất cả các thông tin bài viết ở một nơi. Trước khi chúng tôi bắt đầu phân tích, chúng ta hãy xem làm thế nào một bản tóm tắt bài báo được mô tả trên nettuts +.
1
2
3
4
5
6
7
8
9
<divclass="preview">
<!-- Post Taxonomies -->
<divclass="post_taxonomy"> ... </div>
<!-- Post Title -->
<h1class="post_title"><a>Title</a></h1>
<!-- Post Meta -->
<divclass="post_meta"> ... </div>
<divclass="text"><p>Description</p></div>
</div>
Đây là một bài định dạng cơ bản trên trang web, bao gồm cả mã nguồn ý kiến. Tại sao là những ý kiến quan trọng? Họ tính là nút để phân tích cú pháp.
Bước 4. Bắt đầu Function Parsing
1
2
3
4
5
6
7
8
functiongetArticles($page) {
global$articles;
$html= newsimple_html_dom();
$html->load_file($page);
// ... more ...
}
Chúng tôi bắt đầu rất đơn giản bằng cách tuyên bố toàn cầu của chúng tôi, việc tạo ra một đối tượng simple_html_dom mới, sau đó tải trang chúng tôi muốn phân tích. Chức năng này sẽ được tự xưng sau, vì vậy chúng tôi đặt nó lên để chấp nhận các URL như một tham số.
Đây là thịt của getArticles chức năng. Nó sẽ có một cái nhìn gần hơn để thực sự hiểu những gì đang xảy ra.
Dòng 1 : Tạo một mảng của các yếu tố - div với lớp của ảnh xem thử. Bây giờ chúng ta có một bộ sưu tập các bài báo được lưu trữ trong $ items.
Dòng 5 : $ post tại đề cập đến một div duy nhất của xem trước lớp. Nếu chúng ta nhìn vào mã HTML gốc, chúng ta có thể thấy rằng đứa trẻ thứ ba là H1 chứa tiêu đề bài viết. Chúng tôi mất đó và gán nó đến $ bài viết [index] [0].
Hãy nhớ bắt đầu từ 0 và đếm bình luận khi cố gắng để xác định các chỉ số thích hợp của một nút con.
Dòng 6 : Đứa trẻ thứ sáu của $ post là <div class = "text">. Chúng tôi muốn các văn bản mô tả từ bên trong, vì vậy chúng tôi lấy outertext của đứa con đầu lòng - điều này sẽ bao gồm thẻ đoạn. Một hồ sơ duy nhất trong các bài viết bây giờ trông như thế này:
1
2
$articles[0][0] = "My Article Name Here";
$articles[0][1] = "This is my article description"
Bước 6, Pagination
Điều đầu tiên chúng tôi làm là xác định làm thế nào để tìm thấy trang tiếp theo của chúng tôi. Trên nettuts +, các URL dễ dàng để tìm ra, nhưng chúng ta sẽ giả vờ họ không, và nhận được liên kết tiếp theo thông qua phân tích cú pháp.
Nếu chúng ta nhìn vào mã HTML, chúng ta thấy như sau:
Nếu có một trang tiếp theo (và sẽ không phải luôn luôn), chúng ta sẽ tìm thấy một mỏ neo với lớp của 'nextpostslink'. Bây giờ thông tin có thể được đưa vào sử dụng.
Trên dòng đầu tiên, chúng ta thấy nếu chúng ta có thể tìm thấy một neo với nextpostslink lớp. Chú ý đặc biệt của tham số thứ hai cho find (). Này quy định chúng tôi chỉ muốn phần tử đầu tiên (chỉ số 0) của bộ sưu tập tìm thấy trở lại. $ Tiếp theo sẽ chỉ được giữ một yếu tố duy nhất, chứ không phải là một nhóm các yếu tố này.
Tiếp theo, chúng ta gán HREF của liên kết đến $ URL biến. Đây là quan trọng bởi vì chúng tôi về để tiêu diệt các đối tượng HTML. Do một tham chiếu vòng tròn php5 rò rỉ bộ nhớ, đối tượng simple_html_dom hiện tại phải được xóa và unset trước nhau được tạo ra. Nếu không làm như vậy có thể khiến bạn phải ăn lên tất cả các bộ nhớ có sẵn của bạn.
Cuối cùng, chúng ta gọi là getArticles với URL của trang tiếp theo. đệ quy này sẽ kết thúc khi không có nhiều trang để phân tích.
Bước 7 Xuất ra các kết quả
Đầu tiên chúng ta sẽ thiết lập một vài stylings cơ bản. Đây là hoàn toàn tùy ý - bạn có thể làm cho đầu ra của bạn trông tuy nhiên bạn muốn.
Tiếp theo chúng ta sẽ đặt một chút nhỏ của PHP trong trang để sản xuất các thông tin được lưu trữ trước đó.
1
2
3
4
5
6
7
8
<?php
foreach($articlesas$item) {
echo"<div class='item'>";
echo$item[0];
echo$item[1];
echo"</div>";
}
?>
Kết quả cuối cùng là một trang HTML đơn liệt kê tất cả các bài viết, bắt đầu trên trang chỉ định bởi các getArticles đầu tiên () gọi.
Bước 8 Kết luận
Nếu bạn đang phân tích rất nhiều trang (nói, toàn bộ trang web) nó có thể mất nhiều thời gian thì thời gian thực hiện tối đa cho phép của máy chủ của bạn. Ví dụ, chạy từ máy tính cục bộ của tôi nó chỉ mất một giây mỗi trang (kể cả thời gian để lấy).
Trên một trang web như nettuts, với hiện tại 78 trang hướng dẫn, điều này sẽ đi qua một phút.
Hướng dẫn này sẽ giúp bạn bắt đầu với phân tích cú pháp HTML. Có nhiều phương pháp khác để làm việc với DOM, trong đó có của PHP được xây dựng trong một, cho phép bạn làm việc với selectors xpath mạnh mẽ để tìm các yếu tố. Để dễ dàng sử dụng, và nhanh chóng bắt đầu, tôi tìm thấy thư viện này là một trong những sản phẩm tốt nhất. Là một lưu ý đóng cửa, luôn luôn nhớ phải xin phép trước khi cạo một trang web; điều này quan trọng. Cảm ơn vì đã đọc!