Trong bài học này, đó là những gì chúng tôi dự định làm. Chúng ta sẽ tìm hiểu cách trích xuất các giá trị của các thẻ HTML khác nhau và cũng ghi đè chức năng mặc định của mô-đun này để thêm một số logic của riêng chúng ta. Chúng tôi sẽ làm điều này bằng cách sử dụng lớp HTMLParser trong Python trong html. mô-đun trình phân tích cú pháp. Hãy xem mã đang hoạt động
Nhìn vào lớp HTMLParser
Để phân tích văn bản HTML trong Python, chúng ta có thể sử dụng lớp HTMLParser trong html. mô-đun trình phân tích cú pháp. Hãy xem định nghĩa lớp cho lớp Trình phân tích cú pháp HTML
lớp html. trình phân tích cú pháp. HTMLParser (* , convert_charrefs=True)
Trường convert_charrefs, nếu được đặt thành True sẽ làm cho tất cả các tham chiếu ký tự được chuyển đổi thành tương đương Unicode của chúng. Chỉ các phần tử tập lệnh/kiểu không được chuyển đổi. Bây giờ, chúng ta sẽ cố gắng hiểu từng hàm cho lớp này để hiểu rõ hơn về chức năng của từng hàm
- handle_startendtag Đây là chức năng đầu tiên được kích hoạt khi chuỗi HTML được chuyển đến thể hiện của lớp. Khi văn bản đến đây, quyền kiểm soát được chuyển đến các chức năng khác trong lớp thu hẹp xuống các thẻ khác trong Chuỗi. Điều này cũng rõ ràng trong định nghĩa cho chức năng này
def handle_startendtag ( self, tag, attrs ) .
chính mình. handle_starttag ( tag, attrs )
self. handle_endtag ( thẻ ) - handle_starttag. Phương pháp này quản lý thẻ bắt đầu cho dữ liệu mà nó nhận được. Định nghĩa của nó như hình bên dưới
def handle_starttag ( self, tag, attrs ) .
vượt qua - handle_endtag. Phương pháp này quản lý thẻ kết thúc cho dữ liệu mà nó nhận được
def handle_endtag ( bản thân, thẻ ) .
vượt qua - handle_charref. Phương thức này quản lý các tham chiếu ký tự trong dữ liệu mà nó nhận được. Định nghĩa của nó như hình bên dưới
def handle_charref ( bản thân, tên ) .
vượt qua - handle_entityref. Hàm này xử lý các tham chiếu thực thể trong HTML được truyền cho nó
def handle_entityref ( bản thân, tên ) .
vượt qua - handle_data. Đây là chức năng mà công việc thực sự được thực hiện để trích xuất các giá trị từ các thẻ HTML và được chuyển dữ liệu liên quan đến từng thẻ. Định nghĩa của nó như hình bên dưới
def handle_data ( bản thân, dữ liệu ) .
vượt qua - handle_comment. Sử dụng chức năng này, chúng tôi cũng có thể nhận được các nhận xét được đính kèm với nguồn HTML
def handle_comment ( bản thân, dữ liệu ) .
vượt qua - xử lý_pi. Vì HTML cũng có thể có các hướng dẫn xử lý, đây là chức năng mà các Định nghĩa của nó được hiển thị bên dưới
def handle_pi ( bản thân, dữ liệu ) .
vượt qua - handle_decl. Phương thức này xử lý các khai báo trong HTML, định nghĩa của nó được cung cấp dưới dạng
def handle_decl ( self, decl ) .
vượt qua
Phân lớp con của lớp HTMLParser
Trong phần này, chúng ta sẽ phân lớp con của lớp HTMLParser và sẽ xem xét một số hàm được gọi khi dữ liệu HTML được chuyển đến thể hiện của lớp. Hãy viết một kịch bản đơn giản để làm tất cả những điều này
từ html. trình phân tích cú pháp nhập HTMLParser
LinuxHTMLParser ( HTMLLParser ):
def handle_starttag ( self, tag, attrs ):
in ("Đã gặp thẻ bắt đầu. " , thẻ )
def handle_endtag (self, tag):
in ("Đã gặp thẻ kết thúc. " , thẻ )
def handle_data (self, data):
in ("Đã tìm thấy dữ liệu. " , dữ liệu )
parser = Trình phân tích cú pháp HTML Linux ( . feed . feed . feed . feed . feed . feed . feed . feed . feed)
parser.feed(''
'Python HTML parsing module
')
Đây là những gì chúng tôi nhận được với lệnh này
Lớp con Python HTMLParser
Hàm HTMLParser
Trong phần này, chúng ta sẽ làm việc với các chức năng khác nhau của lớp HTMLParser và xem xét chức năng của từng chức năng đó.
từ html. trình phân tích cú pháp nhập HTMLParser
từ html. thực thể nhập name2codepoint
class LinuxHint_Parse ( HTMLParser ):
def handle_starttag ( self, tag, attrs ):
in ("Thẻ bắt đầu. " , thẻ )
cho attr in attrs:
in (" attr. " , attr )
def handle_endtag (self, tag):
in ("Thẻ kết thúc. " , thẻ )
def handle_data (self, data):
in ("Dữ liệu. " , dữ liệu )
def handle_comment (self, data):
in ("Nhận xét. " , dữ liệu )
def handle_entityref (self, name):
c = chr ( name2codepoint [name])
print("Named ent:" , c )
def handle_charref (self, name):
if tên. bắt đầu bằng ('x') .
c = chr ( int (name[1:] , 16)) .
else:
c = chr ( int (name))
print("Num ent :" , c )
def handle_decl (self, data):
in ("Decl. " , dữ liệu )
parser = LinuxHint_Parse ()
Với các lệnh gọi khác nhau, hãy để chúng tôi cung cấp dữ liệu HTML riêng biệt cho phiên bản này và xem những lệnh gọi này tạo ra kết quả gì. Chúng ta sẽ bắt đầu với một chuỗi DOCTYPE đơn giản
trình phân tích cú pháp. nguồn cấp dữ liệu ('
'"http. //www. w3. org/TR/html4/nghiêm ngặt. dtd">')
Đây là những gì chúng tôi nhận được với cuộc gọi này
Chuỗi DOCTYPE
Bây giờ chúng ta hãy thử một thẻ hình ảnh và xem nó trích xuất dữ liệu gì
trình phân tích cú pháp. feed (')
Đây là những gì chúng tôi nhận được với cuộc gọi này
Thẻ hình ảnh HTMLParser
Tiếp theo, hãy thử cách thẻ script hoạt động với các hàm Python
trình phân tích cú pháp. feed ('
'alert(")
parser.feed(''''''''''''''''''''''''')
trình phân tích cú pháp. feed ('#python { color. xanh }')
Đây là những gì chúng tôi nhận được với cuộc gọi này
Thẻ tập lệnh trong htmlparser
Cuối cùng, chúng tôi cũng chuyển nhận xét cho phần HTMLParser
trình phân tích cú pháp. nguồn cấp dữ liệu ('
')
Đây là những gì chúng tôi nhận được với cuộc gọi này
Phân tích cú pháp nhận xét
Phần kết luận
Trong bài học này, chúng ta đã xem xét cách chúng ta có thể phân tích cú pháp HTML bằng cách sử dụng lớp HTMLParser của Python mà không cần bất kỳ thư viện nào khác. Chúng tôi có thể dễ dàng sửa đổi mã để thay đổi nguồn dữ liệu HTML thành ứng dụng khách HTTP