Trình phân tích cú pháp HTML đơn giản

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;

Trình phân tích cú pháp HTML đơn giản


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 herep>body>html>');

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

Trình phân tích cú pháp HTML đơn giản

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
2
0
5
2
2
6
2
4

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
2
6
2
2
8
3
$html = new simple_html_dom();
4
3
2
5
6
3
5
$html = new simple_html_dom();
1
3
7
3
8
3
9
// 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

7

Sử 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

7

HTML 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
4
9
5
2
2
6
2
4

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('

Hello World!

We're herep>body>html>');

5
2
_______67
3
4
5
0_______7
5
2
6
$html = new simple_html_dom();
1
5
5
3
8
5
7
3
9
// Load from a string

1


0
// Load from a string

3


2
// Load from a string

4
// Load from a string

6


5


6


7

Ví 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

Trình phân tích cú pháp HTML đơn giả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

Trình phân tích cú pháp HTML đơn giản

1
2
8
2
3
6
2
4
6
4

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
6
6
2
6
8
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
3
8
$html = new simple_html_dom();
10
3
9
$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
3
8
$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

Trình phân tích cú pháp HTML đơn giả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

. We want the description text from within, so we grab the first child's outertext - this will include the paragraph tag. A single record in articles now looks like this:

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

Trình phân tích cú pháp HTML đơn giản

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
3
8
$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

Trình phân tích cú pháp HTML đơn giả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
3
8
$html = new simple_html_dom();
67
3
9
$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
2
00
2
01
2
02
$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
2
05
2
2
07
3
2
09
4
2
11
5
2
13
6
2
15
$html = new simple_html_dom();
1
2
17
3
8
2
19

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

Trình phân tích cú pháp HTML tốt nhất là gì?

htmlparser2 là trình phân tích cú pháp HTML nhanh nhất và sử dụng một số phím tắt để đến đó.

Trình phân tích cú pháp HTML là gì?

Trình phân tích cú pháp HTML là phần mềm để phân tích ngôn ngữ đánh dấu siêu văn bản (HTML) tự động . Họ có hai mục đích chính. duyệt HTML. cung cấp một giao diện để các lập trình viên dễ dàng truy cập và sửa đổi "mã chuỗi HTML". ví dụ kinh điển. Trình phân tích cú pháp DOM.

Làm cách nào để phân tích cú pháp HTML bằng Python?

Ví dụ .
từ html. trình phân tích cú pháp nhập HTMLParser
Trình phân tích cú pháp lớp (HTMLParser)
# phương pháp nối thêm thẻ bắt đầu vào danh sách start_tags
def handle_starttag(bản thân, thẻ, attrs)
start_tags toàn cầu
start_tags. nối thêm (thẻ)
# phương thức nối thêm thẻ kết thúc vào danh sách end_tags
def handle_endtag(bản thân, thẻ)

HTML DOM đơn giản là gì?

HTML DOM là Mô hình đối tượng cho HTML . Nó định nghĩa. Các phần tử HTML dưới dạng đối tượng. Thuộc tính cho tất cả các phần tử HTML. Các phương thức cho tất cả các phần tử HTML.