Nếu bạn cần phân tích cú pháp HTML, thì biểu thức chính quy không phải là cách tốt nhất. Trong hướng dẫn này, bạn sẽ học cách sử dụng một trình phân tích cú pháp mã nguồn mở, dễ học, để đọc, sửa đổi và lấy lại 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 lấy danh sách tất cả các bài viết được xuất bản trên trang web và hiển thị chúng
Bước 1. Sự chuẩn bị
Điều đầu tiên bạn cần làm là tải xuống một bản sao của thư viện SimpleHTMLdom, có sẵn miễn phí từ sourceforge
Có một số tệp trong quá trình tải xuống, nhưng tệp duy nhất bạn cần là simple_html_dom. tập tin php;
Bước 2. Khái niệm cơ bản về phân tích cú pháp
Thư viện này rất dễ sử dụng, nhưng có một số điều cơ bản bạn nên xem lại trước khi đưa nó vào hoạt động
Đang tải HTML
1
$html = new simple_html_dom[];
2
3
// Load from a string
4
$html->load['Hello World!
We'
re here'];
5
6
$html = new simple_html_dom[];0
$html = new simple_html_dom[];1
$html = new simple_html_dom[];2
Bạn có thể tạo đối tượng ban đầu của mình bằng cách tải HTML từ một chuỗi hoặc từ một tệp. Việc tải tệp có thể được thực hiện qua URL hoặc qua hệ thống tệp cục bộ của bạn
Một lưu ý thận trọng. Phương thức load_file[] ủy thác công việc của nó cho file_get_contents của PHP. Nếu allow_url_fopen không được đặt thành true trong php của bạn. ini, bạn có thể không mở được tệp từ xa theo cách này. Bạn luôn có thể quay lại thư viện CURL để tải các trang từ xa trong trường hợp này, sau đó đọc chúng bằng phương thức load[]
truy cập thông tin
Khi bạn có đối tượng DOM của mình, 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 các bộ sưu tập. Bộ sưu tập là một nhóm các đối tượng được tìm thấy thông qua bộ chọn - cú pháp khá giống với jQuery
1
$html = new simple_html_dom[];4
2
$html = new simple_html_dom[];6
3
$html = new simple_html_dom[];8
4
20
5
22
6
24
Trong HTML ví dụ này, chúng ta sẽ xem xét cách truy cập thông tin trong đoạn thứ hai, thay đổi nó và sau đó xuất kết quả
1
26
2
28
3
$html = new simple_html_dom[];
4
32
5
6
35
$html = new simple_html_dom[];1
37
38
39
// Load from a string
0// Load from a string
1// Load from a string
2// Load from a string
3// Load from a string
4// Load from a string
5// Load from a string
6// Load from a string
7Sử dụng phương thức find[] luôn trả về một tập hợp [mảng] các thẻ trừ khi bạn chỉ định rằng bạn chỉ muốn con thứ n, làm tham số thứ hai
Dòng 2-4. Tải HTML từ một chuỗi, như đã giải thích trước đây
Line 7: This line finds all
tags in the HTML, and returns them as an array. The first paragraph will have an index of 0, and subsequent paragraphs will be indexed accordingly.
dòng 10. Điều này truy cập mục thứ 2 trong bộ sưu tập các đoạn văn của chúng tôi [chỉ mục 1] và bổ sung cho thuộc tính văn bản bên trong của nó. Văn bản bên trong biểu thị nội dung giữa các thẻ, trong khi văn bản bên ngoài biểu thị nội dung bao gồm cả thẻ. Chúng tôi có thể thay thế hoàn toàn thẻ bằng cách sử dụng văn bản bên ngoài
Chúng tôi sẽ thêm một dòng nữa và sửa đổi lớp của thẻ đoạn thứ hai của chúng tôi
1
// Load from a string
9____2// Load from a string
7HTML kết quả của lệnh lưu sẽ là
1
$html = new simple_html_dom[];4
2
$html = new simple_html_dom[];6
3
$html = new simple_html_dom[];8
4
49
5
22
6
24
Bộ chọn 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, những điều này có vẻ rất quen thuộc
1
$html->load['5Hello World!
We'
re here'];
2_______67
3
4
50_______7
52
6
$html = new simple_html_dom[];1
55
38
57
39
// Load from a string
1
0// Load from a string
3
2// Load from a string
4// Load from a string
6
5
6
7Ví dụ đầu tiên không hoàn toàn trực quan - theo mặc định, tất cả các truy vấn đều trả về các bộ sưu tập, kể cả truy vấn ID, chỉ trả về một kết quả duy nhất. Tuy nhiên, bằng cách chỉ định tham số thứ hai, chúng tôi đang nói "chỉ trả về mục đầu tiên của bộ sưu tập này"
Điều này có nghĩa là $single là một phần tử đơn lẻ, chứ không phải là một mảng các phần tử với một phần tử
Phần còn lại của các ví dụ là tự giải thích
Tài liệu
Toàn bộ tài liệu về thư viện có thể được tìm thấy tại trang tài liệu dự án
Bước 3. Ví dụ thế giới thực
Để đưa thư viện này vào hoạt động, chúng ta sẽ viết một kịch bản nhanh để thu thập nội dung của trang web Nettuts và tạo danh sách các bài viết có trên trang web theo tiêu đề và mô tả. chỉ là một ví dụ. Quét là một khu vực phức tạp trên web và không được thực hiện khi chưa được phép
1
28
2
3
62
4
64
Chúng tôi bắt đầu bằng cách bao gồm thư viện và gọi hàm getArticles với trang mà 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ủ của Nettuts
Chúng tôi cũng đang khai báo một mảng toàn cầu để đơn giản hóa việc thu thập tất cả thông tin bài viết ở một nơi. Trước khi bắt đầu phân tích cú pháp, chúng ta hãy xem cách mô tả tóm tắt bài viết trên Nettuts+
1
66
2
68
3
$html = new simple_html_dom[];00
4
$html = new simple_html_dom[];02
5
$html = new simple_html_dom[];04
6
$html = new simple_html_dom[];06
$html = new simple_html_dom[];1
$html = new simple_html_dom[];08
38
$html = new simple_html_dom[];10
39
$html = new simple_html_dom[];12
Điều này đại diện cho một định dạng bài đăng cơ bản trên trang web, bao gồm các bình luận về mã nguồn. Tại sao các ý kiến quan trọng?
Bước 4. Bắt đầu chức năng phân tích cú pháp
1
$html = new simple_html_dom[];14
2
$html = new simple_html_dom[];16
3
4
$html = new simple_html_dom[];19
5
$html = new simple_html_dom[];21
6
$html = new simple_html_dom[];1
$html = new simple_html_dom[];24
38
$html = new simple_html_dom[];26
Chúng tôi bắt đầu rất đơn giản bằng cách yêu cầu toàn cầu của mình, tạo một đối tượng simple_html_dom mới, sau đó tải trang mà chúng tôi muốn phân tích cú pháp. Chức năng này sẽ tự gọi sau, vì vậy chúng tôi đang thiết lập chức năng này để chấp nhận URL làm tham số
Bước 5. Tìm thông tin chúng tôi muốn
1
$html = new simple_html_dom[];28
2
3
$html = new simple_html_dom[];31
4
$html = new simple_html_dom[];33
5
$html = new simple_html_dom[];35
6
$html = new simple_html_dom[];37
$html = new simple_html_dom[];1
$html = new simple_html_dom[];26
Đây là cốt lõi của hàm get Articles. Sẽ xem xét kỹ hơn để thực sự hiểu chuyện gì đang xảy ra
Dòng 1. Tạo một mảng các phần tử - div với lớp xem trước. Bây giờ chúng tôi có một bộ sưu tập các bài báo được lưu trữ trong $items
Dòng 5. $post hiện đề cập đến một div duy nhất của bản xem trước lớp. Nếu nhìn vào HTML gốc, chúng ta có thể thấy con thứ 3 là H1 chứa tiêu đề bài viết. Chúng tôi lấy thông tin đó và gán cho $articles[index][0]
Hãy nhớ bắt đầu từ 0 và đếm nhận xét khi cố gắng xác định chỉ mục thích hợp của nút con
Line 6: The sixth child of $post is
1____141
2
$html = new simple_html_dom[];43
Bước 6, Phân trang
Điều đầu tiên chúng tôi làm là xác định cách tìm trang tiếp theo của chúng tôi. Trên Nettuts+, các URL rất dễ tìm ra nhưng chúng tôi sẽ giả vờ như không phải như vậy và lấy 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 HTML, chúng ta sẽ thấy như sau
1
$html = new simple_html_dom[];45
Nếu có một trang tiếp theo [và không phải lúc nào cũng có], chúng ta sẽ tìm thấy một mỏ neo có loại 'nextpostslink'. Bây giờ thông tin đó có thể được đưa vào sử dụng
1
$html = new simple_html_dom[];47
2_______149
3
4
$html = new simple_html_dom[];52
5
$html = new simple_html_dom[];54
6
$html = new simple_html_dom[];1
$html = new simple_html_dom[];57
38
$html = new simple_html_dom[];26
Ở dòng đầu tiên, chúng tôi xem liệu chúng tôi có thể tìm thấy một mỏ neo với lớp nextpostslink hay không. Đặc biệt chú ý đến tham số thứ hai cho find[]. Điều này chỉ định rằng chúng tôi chỉ muốn phần tử đầu tiên [chỉ mục 0] của bộ sưu tập được tìm thấy được trả về. $next sẽ chỉ giữ một phần tử duy nhất, thay vì một nhóm phần tử
Tiếp theo, chúng tôi gán HREF của liên kết cho biến $URL. Điều này rất quan trọng vì chúng ta sắp phá hủy đối tượng HTML. Do rò rỉ bộ nhớ tham chiếu vòng tròn php5, đối tượng simple_html_dom hiện tại phải được xóa và bỏ đặt trước khi một đối tượng khác được tạo. Không làm như vậy có thể khiến bạn ăn hết bộ nhớ khả dụng của mình
Cuối cùng, chúng tôi gọi get Articles với URL của trang tiếp theo. Đệ quy này kết thúc khi không còn trang nào để phân tích cú pháp
Bước 7 Xuất kết quả
Đầu tiên chúng ta sẽ thiết lập một vài kiểu dáng cơ bản. Điều này là hoàn toàn tùy ý - bạn có thể làm cho đầu ra của mình trông như thế nào bạn muốn
1
$html = new simple_html_dom[];61
2
$html = new simple_html_dom[];63
3
$html = new simple_html_dom[];65
4
$html = new simple_html_dom[];67
5
$html = new simple_html_dom[];69
6
$html = new simple_html_dom[];71
$html = new simple_html_dom[];1
$html = new simple_html_dom[];73
38
$html = new simple_html_dom[];67
39
$html = new simple_html_dom[];77
// Load from a string
1$html = new simple_html_dom[];79
// Load from a string
3$html = new simple_html_dom[];81
// Load from a string
4$html = new simple_html_dom[];67
// Load from a string
6$html = new simple_html_dom[];85
6$html = new simple_html_dom[];87
$html = new simple_html_dom[];88
$html = new simple_html_dom[];89
$html = new simple_html_dom[];90
$html = new simple_html_dom[];91
$html = new simple_html_dom[];92
$html = new simple_html_dom[];93
$html = new simple_html_dom[];94
$html = new simple_html_dom[];95
$html = new simple_html_dom[];96
$html = new simple_html_dom[];67
$html = new simple_html_dom[];98
$html = new simple_html_dom[];99
200
201
202
$html = new simple_html_dom[];67
Tiếp theo, chúng ta sẽ đặt một chút PHP vào trang để xuất thông tin được lưu trữ trước đó
1
205
2
207
3
209
4
211
5
213
6
215
$html = new simple_html_dom[];1
217
38
219
Kết quả cuối cùng là một trang HTML duy nhất liệt kê tất cả các bài báo, bắt đầu từ trang được chỉ định bởi lệnh gọi getArticles[] đầu tiên
Bước 8 Kết luận
Nếu bạn đang phân tích cú pháp nhiều trang [giả sử toàn bộ trang web] thì có thể mất nhiều thời gian hơn thời gian thực hiện tối đa mà máy chủ của bạn cho phép. Ví dụ: chạy từ máy cục bộ của tôi, mất khoảng một giây trên mỗi trang [bao gồm cả thời gian tìm nạp]
Trên một trang web như Nettuts, với 78 trang hướng dẫn hiện tại, điều này sẽ mất hơn 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ó các phương pháp khác để làm việc với DOM, bao gồm một phương pháp được tích hợp sẵn của PHP, cho phép bạn làm việc với các bộ chọn xpath mạnh mẽ để tìm các phần tử. Để dễ sử dụng và bắt đầu nhanh, tôi thấy thư viện này là một trong những thư viện tốt nhất. Như một lưu ý kết thúc, hãy luôn nhớ xin phép trước khi cạo một trang web; . Cảm ơn vì đã đọc