Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất

Mã nguồn: lib/html/Parser.py Lib/html/parser.py


Mô-đun này xác định một lớp

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
0 đóng vai trò là cơ sở để phân tích các tệp văn bản được định dạng bằng HTML (Ngôn ngữ đánh dấu siêu văn bản) và XHTML.

Lớp ________ 11 ________ 12 (*, convert_charrefs = true) ¶(*, convert_charrefs=True)

Tạo một thể hiện phân tích cú pháp có thể phân tích đánh dấu không hợp lệ.

Nếu convert_charrefs là

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
3 (mặc định), tất cả các tham chiếu ký tự (ngoại trừ các tài liệu trong ____ 14/________ 15 phần tử) sẽ tự động chuyển đổi thành các ký tự Unicode tương ứng.

Một ví dụ

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
0 được cho dữ liệu HTML và các phương thức xử lý gọi khi các thẻ bắt đầu, thẻ kết thúc, văn bản, nhận xét và các yếu tố đánh dấu khác gặp phải. Người dùng nên phân lớp
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
0 và ghi đè các phương thức của mình để thực hiện hành vi mong muốn.

Trình phân tích cú pháp này không kiểm tra xem các thẻ kết thúc có khớp thẻ bắt đầu hay gọi trình xử lý thẻ cuối cho các phần tử được đóng hoàn toàn bằng cách đóng một phần tử bên ngoài.

Đã thay đổi trong phiên bản 3.4: Convert_charrefs đối số từ khóa được thêm vào.convert_charrefs keyword argument added.

Đã thay đổi trong phiên bản 3.5: Giá trị mặc định cho đối số Convert_charrefs hiện là

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
3.The default value for argument convert_charrefs is now
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
3.

Ví dụ Ứng dụng phân tích cú pháp HTML

Ví dụ cơ bản, dưới đây là trình phân tích cú pháp HTML đơn giản sử dụng lớp

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
0 để in ra thẻ bắt đầu, thẻ cuối và dữ liệu khi chúng gặp phải:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()
parser.feed('Test'
            '

Parse me!

'
)

Đầu ra sau đó sẽ là:

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html

Encountered a start tag: html Encountered a start tag: head Encountered a start tag: title Encountered some data : Test Encountered an end tag : title Encountered an end tag : head Encountered a start tag: body Encountered a start tag: h2 Encountered some data : Parse me! Encountered an end tag : h2 Encountered an end tag : body Encountered an end tag : html 0 Phương pháp ¶

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
0 Các trường hợp có các phương pháp sau:

________ 22 ________ 23 (dữ liệu) ¶(data)

Cho ăn một số văn bản cho trình phân tích cú pháp. Nó được xử lý trong chừng mực vì nó bao gồm các yếu tố hoàn chỉnh; Dữ liệu không đầy đủ được đệm cho đến khi có nhiều dữ liệu được cung cấp hoặc

from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start tag:", tag)
        for attr in attrs:
            print("     attr:", attr)

    def handle_endtag(self, tag):
        print("End tag  :", tag)

    def handle_data(self, data):
        print("Data     :", data)

    def handle_comment(self, data):
        print("Comment  :", data)

    def handle_entityref(self, name):
        c = chr(name2codepoint[name])
        print("Named ent:", c)

    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print("Num ent  :", c)

    def handle_decl(self, data):
        print("Decl     :", data)

parser = MyHTMLParser()
4 được gọi. Dữ liệu phải là
from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start tag:", tag)
        for attr in attrs:
            print("     attr:", attr)

    def handle_endtag(self, tag):
        print("End tag  :", tag)

    def handle_data(self, data):
        print("Data     :", data)

    def handle_comment(self, data):
        print("Comment  :", data)

    def handle_entityref(self, name):
        c = chr(name2codepoint[name])
        print("Named ent:", c)

    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print("Num ent  :", c)

    def handle_decl(self, data):
        print("Decl     :", data)

parser = MyHTMLParser()
5.

________ 22 ________ 27 ()()

Xử lý lực của tất cả dữ liệu được đệm như thể nó được theo sau bởi một dấu cuối cùng. Phương pháp này có thể được xác định lại bởi một lớp dẫn xuất để xác định xử lý bổ sung ở cuối đầu vào, nhưng phiên bản được xác định lại phải luôn gọi phương thức lớp cơ sở ____1010

from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start tag:", tag)
        for attr in attrs:
            print("     attr:", attr)

    def handle_endtag(self, tag):
        print("End tag  :", tag)

    def handle_data(self, data):
        print("Data     :", data)

    def handle_comment(self, data):
        print("Comment  :", data)

    def handle_entityref(self, name):
        c = chr(name2codepoint[name])
        print("Named ent:", c)

    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print("Num ent  :", c)

    def handle_decl(self, data):
        print("Decl     :", data)

parser = MyHTMLParser()
4.

________ 22 ________ 31 ()()

Đặt lại trường hợp. Mất tất cả dữ liệu chưa qua xử lý. Điều này được gọi là ngầm vào thời điểm khởi tạo.

________ 22 ________ 33 ()()

Trả về số dòng hiện tại và bù.

________ 22 ________ 35 ()()

Trả về văn bản của thẻ bắt đầu được mở gần đây nhất. Điều này thường không cần thiết để xử lý có cấu trúc, nhưng có thể hữu ích trong việc xử lý HTML, khi được triển khai hoặc để tạo lại đầu vào với những thay đổi tối thiểu (có thể bảo tồn được khoảng trắng giữa các thuộc tính, v.v.).

Các phương pháp sau được gọi là khi các phần tử dữ liệu hoặc đánh dấu gặp phải và chúng có nghĩa là được ghi đè trong một lớp con. Việc triển khai lớp cơ sở không làm gì cả (ngoại trừ

>>> parser.feed('
...             '"http://www.w3.org/TR/html4/strict.dtd">')
Decl     : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
6):

________ 22 ________ 38 (Tag, attrs) ¶(tag, attrs)

Phương thức này được gọi để xử lý thẻ bắt đầu của một phần tử (ví dụ:

>>> parser.feed('
...             '"http://www.w3.org/TR/html4/strict.dtd">')
Decl     : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
9).

Đối số thẻ là tên của thẻ được chuyển đổi thành chữ thường. Đối số attrs là danh sách các cặp

>>> parser.feed('
Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất
'
) Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('

Python

'
) Start tag: h2 Data : Python End tag : h2
0 chứa các thuộc tính được tìm thấy bên trong dấu ngoặc ____ ____41. Tên sẽ được dịch thành chữ thường và trích dẫn trong giá trị đã được xóa, và các tài liệu tham khảo ký tự và thực thể đã được thay thế.

Chẳng hạn, đối với thẻ

>>> parser.feed('
Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất
'
) Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('

Python

'
) Start tag: h2 Data : Python End tag : h2
2, phương pháp này sẽ được gọi là
>>> parser.feed('
Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất
'
) Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('

Python

'
) Start tag: h2 Data : Python End tag : h2
3.

Tất cả các tham chiếu thực thể từ

>>> parser.feed('
Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất
'
) Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('

Python

'
) Start tag: h2 Data : Python End tag : h2
4 được thay thế trong các giá trị thuộc tính.

________ 22 ________ 46 (TAG) ¶(tag)

Phương pháp này được gọi để xử lý thẻ cuối của một phần tử (ví dụ:

>>> parser.feed('
Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất
'
) Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('

Python

'
) Start tag: h2 Data : Python End tag : h2
7).

Đối số thẻ là tên của thẻ được chuyển đổi thành chữ thường.

________ 22 ________ 49 (Tag, attrs) ¶(tag, attrs)

Tương tự như

>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script
0, nhưng được gọi khi trình phân tích cú pháp gặp một thẻ trống kiểu XHTML (
>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script
1). Phương pháp này có thể được ghi đè bởi các lớp con yêu cầu thông tin từ vựng cụ thể này; Việc triển khai mặc định chỉ đơn giản gọi
>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script
0 và
>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script
3.

________ 22 ________ 55 (dữ liệu) ¶(data)

Phương pháp này được gọi để xử lý dữ liệu tùy ý (ví dụ: các nút văn bản và nội dung của

>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script
6 và
>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script
7).

________ 22 ________ 59 (Tên) ¶(name)

Phương pháp này được gọi để xử lý một tham chiếu ký tự được đặt tên của Mẫu

>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
0 (ví dụ:
>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
1), trong đó tên là tham chiếu thực thể chung (ví dụ:
>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
2). Phương pháp này không bao giờ được gọi nếu Convert_charrefs là
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
3.

________ 22 ________ 65 (Tên) ¶(name)

Phương pháp này được gọi là xử lý các tham chiếu ký tự số thập phân và thập lục phân của mẫu

>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
6 và
>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
7. Ví dụ, tương đương thập phân cho
>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
1 là
>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content
9, trong khi thập lục phân là
>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
0; Trong trường hợp này, phương thức sẽ nhận được
>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
1 hoặc
>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
2. Phương pháp này không bao giờ được gọi nếu Convert_charrefs là
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
3.

________ 22 ________ 75 (dữ liệu) ¶(data)

Phương pháp này được gọi là khi gặp bình luận (ví dụ:

>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
6).

Ví dụ: nhận xét

>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
7 sẽ khiến phương thức này được gọi với đối số
>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
8.

Nội dung của Internet Explorer Nhận xét có điều kiện (Condcoms) cũng sẽ được gửi đến phương thức này, vì vậy, đối với

>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >
9, phương thức này sẽ nhận được
>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span
0.

________ 22 ________ 82 (tuyên bố) ¶(decl)

Phương pháp này được gọi để xử lý khai báo HTML DocType (ví dụ:

>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span
3).

Tham số DEC sẽ là toàn bộ nội dung của khai báo bên trong đánh dấu

>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span
4 (ví dụ:
>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span
5).

________ 22 ________ 87 (dữ liệu) ¶(data)

Phương thức được gọi khi gặp phải hướng dẫn xử lý. Tham số dữ liệu sẽ chứa toàn bộ hướng dẫn xử lý. Ví dụ: đối với hướng dẫn xử lý

>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span
8, phương pháp này sẽ được gọi là
>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span
9. Nó được dự định sẽ được ghi đè bởi một lớp dẫn xuất; Việc thực hiện lớp cơ sở không làm gì cả.

Ghi chú

Lớp

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
0 sử dụng các quy tắc cú pháp SGML để xử lý hướng dẫn. Một hướng dẫn xử lý XHTML bằng cách sử dụng Trailing
>>> parser.feed('

tag soup

'
) Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a
1 sẽ khiến
>>> parser.feed('

tag soup

'
) Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a
1 được đưa vào dữ liệu.

________ 22 ________ 94 (dữ liệu) ¶(data)

Phương pháp này được gọi là khi một tuyên bố không được công nhận được đọc bởi trình phân tích cú pháp.

Tham số dữ liệu sẽ là toàn bộ nội dung của khai báo bên trong đánh dấu

>>> parser.feed('

tag soup

'
) Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a
5. Đôi khi rất hữu ích khi được ghi đè bởi một lớp dẫn xuất. Việc thực hiện lớp cơ sở không làm gì cả.

Ví dụ;

Lớp sau đây thực hiện trình phân tích cú pháp sẽ được sử dụng để minh họa thêm các ví dụ:

from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start tag:", tag)
        for attr in attrs:
            print("     attr:", attr)

    def handle_endtag(self, tag):
        print("End tag  :", tag)

    def handle_data(self, data):
        print("Data     :", data)

    def handle_comment(self, data):
        print("Comment  :", data)

    def handle_entityref(self, name):
        c = chr(name2codepoint[name])
        print("Named ent:", c)

    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print("Num ent  :", c)

    def handle_decl(self, data):
        print("Decl     :", data)

parser = MyHTMLParser()

Phân tích cú pháp do DocType:

>>> parser.feed('
...             '"http://www.w3.org/TR/html4/strict.dtd">')
Decl     : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"

Phân tích một phần tử với một vài thuộc tính và một tiêu đề:

>>> parser.feed('
Hướng dẫn best html parser python - Python phân tích cú pháp html tốt nhất
'
) Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo') >>> >>> parser.feed('

Python

'
) Start tag: h2 Data : Python End tag : h2

Nội dung của các yếu tố

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
4 và
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
5 được trả về, mà không cần phân tích cú pháp thêm:

>>> parser.feed('')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python { color: green }
End tag  : style

>>> parser.feed('')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("hello!");
End tag  : script

Nhận xét phân tích cú pháp:

>>> parser.feed(''
...             '')
Comment  :  a comment
Comment  : [if IE 9]>IE-specific content

Phân tích phân tích các tham chiếu ký tự được đặt tên và số và chuyển đổi chúng sang chính xác (lưu ý: 3 tài liệu tham khảo này đều tương đương với

>>> parser.feed('

tag soup

'
) Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a
8):

>>> parser.feed('>>>')
Named ent: >
Num ent  : >
Num ent  : >

Cho ăn các khối không đầy đủ cho

>>> parser.feed('

tag soup

'
) Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a
9 hoạt động, nhưng
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
00 có thể được gọi nhiều lần (trừ khi convert_charrefs được đặt thành
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h2
Encountered some data  : Parse me!
Encountered an end tag : h2
Encountered an end tag : body
Encountered an end tag : html
3):

>>> for chunk in [', 'an>buff', 'ered ', 'text, 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     : text
End tag  : span

Phân tích cú pháp HTML không hợp lệ (ví dụ: các thuộc tính chưa được trích xuất) cũng hoạt động:

>>> parser.feed('

tag soup

'
) Start tag: p Start tag: a attr: ('class', 'link') attr: ('href', '#main') Data : tag soup End tag : p End tag : a