Bỏ để qua phần nội dung

Một số lựa chọn thay thế BeautifulSoup để phân tích cú pháp HTML bằng Python là gì?

Là một nhà phát triển Python, có lẽ bạn đã quen thuộc với BeautifulSoup (còn gọi là BS4) - thư viện phân tích cú pháp HTML/XML đáng kính, vốn là một phần chính của việc quét web Python trong hơn một thập kỷ.

Nhưng bạn có thể không biết rằng Beautiful Soup hiện nay không phải là lựa chọn duy nhất để phân tích cú pháp HTML bằng Python. Trên thực tế, có một số lượng đáng ngạc nhiên các lựa chọn thay thế BeautifulSoup có khả năng hoạt động tốt mà trong một số trường hợp thậm chí còn vượt qua BS4 về chức năng và hiệu suất.

Trong hướng dẫn toàn diện này, chúng ta sẽ khám phá một số lựa chọn thay thế BeautifulSoup phổ biến và mạnh mẽ nhất để quét và phân tích cú pháp HTML bằng Python.

Tại sao nên xem xét các lựa chọn thay thế BeautifulSoup?

Trước khi đi sâu vào các lựa chọn, bạn có thể tự hỏi – tại sao ngay từ đầu lại phải cân nhắc các lựa chọn thay thế?

Dưới đây là một số lý do khiến bạn có thể muốn xem xét xa hơn BeautifulSoup cho các dự án quét web Python của mình:

  • Hiệu suất tốt hơn – Một số trình phân tích cú pháp mới hơn đáng kể vượt trội hơn BS4 về điểm chuẩn. Tốc độ là rất quan trọng khi cạo các trang web lớn.

  • Thêm tính năng – Các thư viện như lxml cung cấp các khả năng bổ sung như hỗ trợ XPath.

  • Phân tích cú pháp HTML5 tốt hơn – BeautifulSoup đôi khi có thể gặp khó khăn với HTML hiện đại và không đúng định dạng.

  • API dễ dàng hơn – Các thư viện như Parsel cung cấp các API Pythonic trực quan hơn.

  • Đa luồng – Một số trình phân tích cú pháp thay thế cho phép phân tích cú pháp đa luồng để tận dụng nhiều lõi CPU.

  • Tuân thủ tiêu chuẩn – Bạn có thể cần một trình phân tích cú pháp tuân theo đặc tả HTML một cách nghiêm ngặt.

  • Cài đặt dễ dàng hơn – BS4 có một số phần phụ thuộc C có thể gây ra sự cố cài đặt, đặc biệt là trên các hệ thống bị hạn chế như AWS Lambda. Các lựa chọn thay thế bằng mã Python thuần túy có thể triển khai dễ dàng hơn.

Vì vậy, mặc dù BS4 vẫn là một lựa chọn tốt nhưng các lựa chọn tuyệt vời khác cũng đáng để bạn cân nhắc. Chúng ta hãy xem một số lựa chọn thay thế BeautifulSoup tốt nhất để phân tích cú pháp HTML và quét web bằng Python!

lxml – Nhanh như chớp

Một trong những lựa chọn thay thế BeautifulSoup phổ biến và mạnh mẽ nhất là lxml. Thư viện lxml cung cấp API cực kỳ nhanh, giàu tính năng để phân tích cú pháp HTML và XML bằng Python.

Trong các điểm chuẩn, lxml luôn vượt trội hơn BeautifulSoup với tỷ suất lợi nhuận đáng kể. Không có gì lạ khi thấy Cải thiện tốc độ 10-100 lần khi sử dụng lxml để phân tích cú pháp HTML thay vì BeautifulSoup.

Điều này làm cho lxml trở thành một công cụ thiết yếu cho bất kỳ ai tìm kiếm các trang web lớn hoặc phân tích các tài liệu HTML khổng lồ. Ưu điểm về tốc độ cho phép bạn phân tích cú pháp đánh dấu hiệu quả hơn nhiều và giảm chi phí cho việc quét nhiều luồng.

Một số ưu điểm chính của lxml:

  • Tốc độ phân tích cú pháp XML và HTML cực nhanh
  • Hỗ trợ cho các tài liệu rất lớn
  • Hỗ trợ XPath 1.0 cho truy vấn phức tạp
  • Hỗ trợ bộ chọn CSS tương tự như BeautifulSoup
  • Phân luồng dễ dàng hơn - lxml giải phóng GIL để cho phép phân tích cú pháp đa luồng
  • Hỗ trợ phân tích cú pháp HTML5

Hãy xem qua một ví dụ nhanh để xem lxml hoạt động:

from lxml import html
import requests

page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)

# Get headlines 
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)

print(headings)

Ví dụ đơn giản này thể hiện tốc độ của lxml - nó có thể phân tích và truy vấn toàn bộ trang Wikipedia trong một phần nghìn giây!

Một số nhược điểm cần xem xét về lxml:

  • Đường cong học tập phức tạp hơn BeautifulSoup. Truy vấn XPath có đường cong học tập dốc hơn so với bộ chọn CSS.
  • Không có tính năng phát hiện mã hóa tích hợp như BS4.
  • Không có biểu diễn đối tượng Pythonic của các phần tử như BS4. Thao tác được thực hiện thông qua API điều hướng DOM.

Tuy nhiên, đối với hầu hết hoạt động quét web sản xuất, lxml là một phần thiết yếu trong bộ công cụ của bạn. Tốc độ tăng cho phép bạn thu thập nhiều dữ liệu hiệu quả hơn nhiều.

phân tích cú pháp – lxml, đơn giản hóa

Nếu bạn thích những gì lxml mang lại nhưng thấy API quá phức tạp, hãy xem Bưu kiện.

Parsel cung cấp API Pythonic dễ sử dụng hơn bằng cách gói lxml và cung cấp giao diện dựa trên bộ chọn để quét dữ liệu từ HTML/XML.

Ưu điểm chính của phân tích cú pháp là sự đơn giản và dễ đọc. Parsel được thiết kế ngay từ đầu với mục đích quét web, trong khi lxml hỗ trợ phạm vi chức năng phân tích cú pháp XML rộng hơn nhiều.

So với lxml, Parsel cung cấp:

  • Biểu thức bộ chọn CSS được đơn giản hóa
  • Xử lý mã hóa tự động
  • API trích xuất văn bản và thuộc tính dễ dàng hơn nhiều
  • Cách tiếp cận trực quan hơn về tổng thể

Ví dụ: đây là cách trích xuất văn bản và thuộc tính bằng bộ chọn phân tích cú pháp:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/vi/more">More</a></p>
           </div>‘‘‘

sel = Selector(text=html)

print(sel.css(‘p::text‘).get()) # Some text More 

print(sel.css(‘a::attr(href)‘).get()) # /more

API TheSelector sẽ rất quen thuộc với bất kỳ ai đến từ BeautifulSoup hoặc jQuery. Nhưng bạn sẽ nhận được tất cả lợi ích về hiệu suất của lxml một cách sâu sắc!

Nhìn chung, Parsel là một lựa chọn tuyệt vời khi bạn muốn có một giao diện quét đơn giản và trực quan nhưng không muốn hy sinh lợi thế về tốc độ hoặc khả năng tương thích của lxml.

html5lib – Phân tích cú pháp tuân thủ tiêu chuẩn

Một trong những lựa chọn thay thế BeautifulSoup thú vị nhất là html5lib.

html5lib là duy nhất vì nó phân tích HTML theo cách chính xác mà trình duyệt web hiện đại thực hiện. Nó tiếp cận đặc tả HTML một cách nghiêm ngặt và đưa ra một mô hình đối tượng tài liệu tuân thủ chặt chẽ với đặc tả chính thức của W3C DOM.

Ưu điểm của html5lib bao gồm:

  • Phân tích cú pháp HTML trung thực và tuân thủ theo quy tắc trình duyệt HTML5
  • Xử lý khéo léo các đánh dấu không đúng định dạng trong thế giới thực
  • Dễ dàng cài đặt vì nó được triển khai hoàn toàn bằng Python
  • Có thể đóng vai trò thay thế cho BS4 trong hầu hết các trường hợp
  • Có thể tùy chỉnh cao và có thể mở rộng

Hãy xem cách sử dụng html5lib cơ bản:

import html5lib

html = ‘<div><span>Example</span></div>‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

print(dom.getElementsByTagName(‘span‘)[0].toxml())  
# <span>Example</span>

Chúng ta có thể thấy html5lib tạo ra một đối tượng DOM tiêu chuẩn từ tài liệu.

Một nhược điểm là html5lib chậm hơn so với lxml. Nhưng đó là sự lựa chọn tuyệt vời khi bạn cần một trình phân tích cú pháp có thể xử lý ngay cả những đánh dấu không đúng định dạng theo cách tương thích với trình duyệt.

Trình phân tích cú pháp HTML Python thay thế

Mặc dù lxml, Parsel và html5lib là một trong những lựa chọn thay thế BeautifulSoup hiệu quả nhất nhưng vẫn có một số tùy chọn khác:

Các thư viện này đáp ứng các nhu cầu phân tích cú pháp khác nhau. Ví dụ: PyQuery cung cấp thao tác DOM giống như jQuery. BeautifulSoup4 vẫn phổ biến nhờ API đơn giản.

Ngoài ra còn có các ràng buộc Python cho các trình phân tích cú pháp HTML nhanh như Ngôngnhanh tận dụng các công cụ phân tích cú pháp tốc độ cao cơ bản khác.

Mặc dù không phải là sự thay thế trực tiếp nhưng đối với các tác vụ phân tích cú pháp cơ bản, HTMLParser tích hợp của Python cũng có thể hoạt động.

Vấn đề là – đừng giới hạn bản thân chỉ ở BeautifulSoup. Đánh giá nhu cầu của bạn dựa trên nhiều công cụ phân tích có sẵn.

Cách các trình phân tích cú pháp so sánh trong điểm chuẩn

Để chứng minh sự khác biệt về hiệu suất, hãy so sánh một số thao tác phổ biến bằng cách sử dụng BeautifulSoup, lxml, html5lib và HTMLParser của Python.

Tôi đã tạo một cách đơn giản tập lệnh điểm chuẩn gấp nhiều lần các trình phân tích cú pháp khác nhau trên 3 tác vụ:

  1. Phân tích trang HTML Wikipedia ~ 3KB
  2. Tìm tất cả các liên kết
  3. Tìm các phần tử cụ thể

Và đây là kết quả trên máy tính xách tay của tôi:

Trình phân tích cú phápPhân tích thời gianTìm tất cả các liên kếtTìm phần tử
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
ĐẹpSúp12ms18ms1ms
Trình phân tích cú pháp HTML4ms32ms0.5ms

Đúng như mong đợi, lxml cực kỳ nhanh - nhanh gấp 10 lần so với html5lib trong một số thao tác. Đáng ngạc nhiên là HTMLParser giữ chức năng phân tích cú pháp cơ bản nhưng bắt đầu bị trễ khi truy vấn các phần tử.

Những điểm chuẩn này trên một tài liệu nhỏ sẽ làm nổi bật sự khác biệt. Khoảng cách thậm chí còn lớn hơn trên các tài liệu HTML lớn hơn, nơi tốc độ của lxml thực sự tỏa sáng.

Ví dụ thực tế

Bây giờ chúng ta hãy xem qua một số ví dụ thực tế bằng cách sử dụng các trình phân tích cú pháp thay thế này cho các tác vụ quét web:

Quét danh sách sản phẩm bằng lxml

Ở đây chúng tôi sẽ lấy một số danh sách sản phẩm từ một trang web thương mại điện tử. Lxml giúp thực hiện nhanh chóng việc trích xuất bất kỳ dữ liệu nào chúng tôi cần:

from lxml import html
import requests

page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)

# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘) 

for product in products:
   name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
   price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

   print(name, price)   

Với lxml, chúng tôi có thể nhanh chóng phân tích cú pháp ngay cả các tài liệu HTML lớn và sử dụng các truy vấn XPath ngắn gọn để trích xuất bất kỳ dữ liệu nào chúng tôi cần.

Quét bảng bằng gấu trúc và html5lib

Giả sử chúng ta cần trích xuất các bảng HTML vào DataFrame của gấu trúc. Html5lib phân tích các bảng một cách đáng tin cậy:

import html5lib
import pandas as pd

html = ‘‘‘<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
   </tr>
   <tr>
     <td>John</td>
     <td>30</td>  
   </tr>
   <tr>
     <td>Jane</td>
     <td>32</td>  
   </tr>
</table>‘‘‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

rows = []
for tr in dom.getElementsByTagName(‘tr‘):
  rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])

df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)  
#    Name  Age
# 0  John   30   
# 1  Jane   32

Việc tuân thủ các tiêu chuẩn của Html5lib đảm bảo tính năng quét bảng hoạt động ổn định ngay cả khi đánh dấu có vấn đề.

Quét văn bản bằng phân tích cú pháp

Đối với các trang có nhiều văn bản, Parsel giúp việc trích xuất trở nên dễ dàng:

from parsel import Selector 

html = ‘‘‘<div>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
         </div>‘‘‘

sel = Selector(text=html)  
content = sel.xpath(‘//div//text()‘).getall()
print(content)

# [‘Paragraph 1‘, ‘Paragraph 2‘]

Parsel mang đến cho chúng ta sự đơn giản của BeautifulSoup kết hợp với tốc độ của lxml!

Tiêu chí chọn thư viện phân tích cú pháp HTML

Khi đánh giá tất cả các lựa chọn thay thế BeautifulSoup này, tiêu chí nào là quan trọng nhất đối với dự án của bạn?

  • Tốc độ – Nếu hiệu suất là quan trọng, lxml khó bị đánh bại.

  • Tính đúng đắn – Để phân tích cú pháp đáng tin cậy trên các trang có vấn đề, html5lib tỏa sáng.

  • Bộ tính năng – Lxml cung cấp điều hướng DOM hoàn chỉnh hơn và hỗ trợ XPath.

  • API quen thuộc – Bộ chọn CSS của BeautifulSoup dễ học nhất.

  • Xử lý đánh dấu không đúng định dạng – Lxml và html5lib xử lý HTML trong thế giới thực mạnh mẽ hơn.

  • Sự phù hợp với tiêu chuẩn – Html5lib tuân thủ nghiêm ngặt hành vi của trình duyệt HTML5.

  • Dễ sử dụng – Parsel và PyQuery cung cấp các API quét đơn giản nhất.

Không có trình phân tích cú pháp tốt nhất cho tất cả các kịch bản. Phân tích các yêu cầu cụ thể và trường hợp sử dụng của bạn để quyết định điều gì là tối ưu.

Thường sử dụng kết hợp các thư viện là tốt nhất - ví dụ html5lib để phân tích cú pháp và lxml để truy vấn. Kiểm tra các tùy chọn khác nhau trên các trang mẫu để cảm nhận xem những gì hoạt động tốt và đáng tin cậy cho nhu cầu quét web cụ thể của bạn.

Sử dụng ít trình phân tích cú pháp hơn để quét web

Chúng tôi đã tập trung vào các thư viện phân tích cú pháp HTML ở đây. Nhưng điều đáng chú ý là có những lựa chọn thay thế hoàn toàn cho phương pháp phân tích cú pháp.

Có thể cạo dữ liệu mà không cần trình phân tích cú pháp HTML bằng cách sử dụng:

  • Biểu thức chính quy – Regex có thể được sử dụng để khớp mẫu HTML thô và trích xuất dữ liệu. Giòn nhưng đôi khi có thể thực hiện được đối với những trường hợp đơn giản.
  • hoạt động chuỗi – Sử dụng các phương thức chuỗi Python để tìm, tách và cắt các chuỗi HTML.
  • Yêu cầu HTTP – Thực hiện yêu cầu trực tiếp tới API và thu thập các phản hồi API.
  • Tự động hóa trình duyệt – Tận dụng các công cụ như Selenium để loại bỏ nội dung JavaScript được hiển thị.
  • Chuyển đổi sang các định dạng như JSON/XML – Loại bỏ nguồn cấp dữ liệu có cấu trúc thay vì HTML.

Những cách tiếp cận này có thể hữu ích nhưng thường không mở rộng quy mô hoặc hoạt động đáng tin cậy, đặc biệt đối với các trang web phức tạp. Nói chung, các thư viện phân tích cú pháp HTML được khuyên dùng để đảm bảo tính mạnh mẽ.

Nhưng nếu các trang của bạn cực kỳ đơn giản hoặc bạn cần kết xuất JS, thì cách tiếp cận không cần trình phân tích cú pháp có thể đủ.

Chìa khóa chính

Trong khi Beautiful Soup giải quyết được nhiều nhu cầu phân tích cú pháp HTML phổ biến, các lựa chọn thay thế như lxml, Parsel và html5lib đáng để bạn cân nhắc:

  • Lxml – Tiêu chuẩn vàng về tốc độ và hiệu suất. Lý tưởng cho việc quét web ở quy mô sản xuất.

  • bưu kiện – API đơn giản để dễ dàng cạo. Xây dựng trên tốc độ lxml.

  • html5lib – Phân tích cú pháp tương thích với trình duyệt để đảm bảo độ chính xác và tuân thủ tiêu chuẩn.

  • điểm chuẩn – Lxml nhanh hơn tới 100 lần so với html5lib trong một số thao tác.

  • Tiêu chuẩn – Tốc độ so với khả năng đọc và tính chính xác. Đánh giá sự cân bằng cho trường hợp sử dụng của bạn.

  • Không có trình phân tích cú pháp – Đối với các trường hợp đơn giản, các thao tác biểu thức chính quy/chuỗi có thể hoạt động.

Đừng giới hạn bản thân chỉ ở BeautifulSoup – hệ sinh thái Python mang đến sự đa dạng đáng kinh ngạc về khả năng phân tích cú pháp HTML. Tận dụng các công cụ phù hợp cho từng công việc!

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *