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

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àm cách nào để phân tích cú pháp dữ liệu HTML bằng Python?

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

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

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

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

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

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

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

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

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

Làm cách nào để phân tích cú pháp văn bản 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 pháp nối thêm thẻ kết thúc vào danh sách end_tags
def handle_endtag(bản thân, thẻ)

Làm cách nào để trích xuất dữ liệu HTML bằng Python?

Gửi yêu cầu HTTP GET tới URL của trang web mà bạn muốn thu thập, yêu cầu này sẽ phản hồi bằng nội dung HTML . Chúng ta có thể làm điều này bằng cách sử dụng thư viện Request của Python. Tìm nạp và phân tích dữ liệu bằng Beautifulsoup và duy trì dữ liệu trong một số cấu trúc dữ liệu như Dict hoặc List.

Làm cách nào để đọc dữ liệu HTML trong Python?

Cài đặt BeautifulSoup. Sử dụng trình quản lý gói Anaconda để cài đặt gói cần thiết và các gói phụ thuộc của nó. .
Đọc tệp HTML. Trong ví dụ dưới đây, chúng tôi yêu cầu một url được tải vào môi trường python. .
Trích xuất giá trị thẻ. .
Trích xuất tất cả các thẻ

Làm cách nào để đọc đầu ra HTML bằng Python?

Để hiển thị tệp HTML dưới dạng đầu ra python, chúng tôi sẽ sử dụng thư viện codec . Thư viện này được sử dụng để mở các tệp có mã hóa nhất định. Nó nhận một mã hóa tham số làm cho nó khác với hàm open() tích hợp.