Giới thiệu về Web Parsing trong Python với Parsel

Trăn ,03-01-20255 phút đọc

Web scraping đã trở thành một kỹ năng thiết yếu đối với các nhà phát triển Python, nhà khoa học dữ liệu và những người đam mê web scraping. Cho dù bạn đang trích xuất dữ liệu để phân tích, xây dựng công cụ so sánh giá hay tự động trích xuất nội dung, thì phân tích cú pháp web là cốt lõi của mỗi tác vụ này. Nhưng điều gì làm cho phân tích cú pháp web vừa hiệu quả vừa thân thiện với người mới bắt đầu? Hãy đến với Parsel —một thư viện mạnh mẽ trong Python giúp đơn giản hóa việc phân tích cú pháp HTML và trích xuất dữ liệu.

Giới thiệu về Parsel

Phân tích web là gì và tại sao nó lại quan trọng?

Parsel là một thư viện Python nhẹ được thiết kế để phân tích cú pháp HTML/XML và trích xuất dữ liệu. Được xây dựng với mục đích thu thập dữ liệu web, Parsel giúp bạn dễ dàng tương tác với các cấu trúc trang web bằng các bộ chọn mạnh mẽ như XPathCSS . Các công cụ này cho phép bạn định vị và trích xuất các thành phần hoặc thuộc tính cụ thể từ các trang web một cách chính xác. Việc tích hợp Parsel với hệ sinh thái của Python cũng có nghĩa là nó hoạt động liền mạch với các thư viện như ` request` và ` httpx` để truy xuất nội dung web.

Các tính năng chính của Parsel

  • Hỗ trợ bộ chọn: Sử dụng XPath để điều hướng đường dẫn chi tiết hoặc bộ chọn CSS để có cú pháp đơn giản hơn.
  • Tính linh hoạt: Hỗ trợ nhiều tác vụ phân tích cú pháp HTML/XML, từ trích xuất văn bản đơn giản đến xử lý các phần tử lồng nhau sâu.
  • Khả năng mở rộng: Parsel có thể trích xuất dữ liệu từ một trang hoặc nhiều trang thông qua các cấu trúc lặp.
  • Tích hợp với Scrapy: Khả năng tương thích của Parsel cũng mở rộng sang Scrapy, một nền tảng thu thập dữ liệu web phổ biến.

Các trường hợp sử dụng phổ biến

  • Thu thập dữ liệu web: Trích xuất dữ liệu từ các trang web thương mại điện tử để theo dõi giá.
  • Khai thác dữ liệu: Thu thập thông tin liên lạc hoặc dữ liệu nghiên cứu từ hồ sơ công khai.
  • Tự động hóa: Hợp lý hóa các tác vụ lặp đi lặp lại như tải xuống thông số kỹ thuật sản phẩm.

Hiểu về Selectors và phân tích cú pháp HTML

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

Phân tích cú pháp HTML là quá trình chia nhỏ một tài liệu HTML thành các thành phần cấu trúc, chẳng hạn như thẻ, thuộc tính và Mô hình đối tượng tài liệu (DOM). Parsel sử dụng cấu trúc này để định vị và trích xuất chính xác dữ liệu bạn cần.

Tài liệu HTML được xây dựng bằng cách sử dụng:

  • Thẻ: Xác định loại phần tử (ví dụ:, <h1>, <p>, <img>).
  • Thuộc tính: Cung cấp thông tin bổ sung về một phần tử (ví dụ: nhận dạng, lớp học, href).
  • DOM: Một biểu diễn phân cấp của trang web, cho phép điều hướng giữa các phần tử.

Bộ chọn là gì?

Bộ chọn XPathCSS là ngôn ngữ truy vấn được sử dụng để chọn các phần tử trong tài liệu HTML:

  • XPath: Mạnh mẽ và giàu tính năng, XPath cho phép bạn chọn các nút dựa trên đường dẫn của chúng trong DOM, mối quan hệ cha-con và các điều kiện.
  • Bộ chọn CSS: Cú pháp đơn giản hơn thường được sử dụng trong phát triển front-end, lý tưởng để chọn các phần tử dựa trên lớp, ID hoặc bộ chọn giả.

Đọc thêm về Selectors tại đây .

Điều kiện tiên quyết

Trước khi bắt đầu sử dụng Parsel, hãy đảm bảo những điều sau:

  • Python đã cài đặt: Tải xuống và cài đặt Python từ
  • Cài đặt các thư viện cần thiết ( parsel , requests ): 
pip cài đặt yêu cầu phân tích cú pháp

Kỹ thuật phân tích cú pháp cho phân tích cú pháp HTML

Trích xuất các phần tử theo ID và lớp

Parsel cho phép chúng ta phân tích cú pháp một phần tử chỉ bằng cách biết tên lớp hoặc ID của nó. Điều này đặc biệt hữu ích khi nhắm mục tiêu vào các phần tử cụ thể trong trang web để trích xuất dữ liệu.

Để chứng minh, chúng ta sẽ sử dụng điều này trang web ví dụ. Chúng tôi sẽ tập trung vào việc trích xuất dữ liệu từ một phần tử có tên lớp sản phẩm_pod, đại diện cho một mục nhập sách duy nhất.

Dưới đây là một ví dụ về cấu trúc HTML của nó:

Từ phần tử này, chúng ta sẽ trích xuất:

  • Tiêu đề của cuốn sách
  • Giá của cuốn sách
  • Trạng thái sẵn có

Ví dụ về mã Python

yêu cầu nhập từ parsel import Selector # Lấy trang web url = "https://books.toscrape.com/" response = requests. get (url) selector = Selector(response.text) # Chọn sản phẩm đầu tiên theo lớp product = selector.css( "article.product_pod" ). get () # Phân tích chi tiết từ sản phẩm đã chọn product_selector = Selector( text =product) title = product_selector.css( "h3 a::attr(title)" ). get () price = product_selector.css( "p.price_color::text" ). get () availability = product_selector.css( "p.instock.availability::text" ). get ().strip() print ( "Title:" , title) print ( "Price:" , price) print ( "Availability:" , availability)

Giải thích về kịch bản:

  • Lấy trang web: Kịch bản gửi một LẤY yêu cầu đến trang web mẫu để lấy nội dung HTML của trang web đó.
  • Chọn khối sản phẩm: Nó sử dụng bộ chọn CSS bài viết.product_pod để chọn mục sách đầu tiên trong trang.
  • Phân tích chi tiết sản phẩm: Kịch bản trích xuất tiêu đề, giá, Và sự sẵn có bằng cách nhắm mục tiêu vào các thẻ HTML và thuộc tính cụ thể trong sản phẩm_pod khối.
  • Hiển thị kết quả: Dữ liệu được trích xuất sẽ được in ra bảng điều khiển theo định dạng có thể đọc được.

Ví dụ đầu ra

Tiêu đề: A Light in the Attic Giá: £ 51,77 Tình trạng: Còn hàng

Trích xuất văn bản từ các phần tử

Parsel giúp trích xuất văn bản từ các thành phần HTML một cách dễ dàng, cho dù đó là tiêu đề, mô tả hay nội dung hiển thị khác trên trang web.

Để chứng minh, chúng ta sẽ sử dụng cùng một trang web ví dụ một lần nữa. Chúng tôi sẽ tập trung vào việc trích xuất văn bản tiêu đề của một cuốn sách duy nhất bằng cách sử dụng h3 thẻ lồng nhau bên trong một phần tử bài viết với lớp sản phẩm_pod.

Dưới đây là một ví dụ về cấu trúc HTML của nó:

Từ phần tử này, chúng ta sẽ trích xuất:

  • Văn bản tiêu đề của cuốn sách

Ví dụ về mã Python

yêu cầu nhập từ parsel import Selector # Lấy trang web url = "https://books.toscrape.com/" response = requests. get (url) selector = Selector(response.text) # Chọn sản phẩm đầu tiên theo lớp product = selector.css( "article.product_pod" ). get () # Phân tích cú pháp văn bản tiêu đề từ sản phẩm đã chọn product_selector = Selector( text =product) title_text = product_selector.css( "h3 a::attr(title)" ). get () print ( "Văn bản tiêu đề:" , title_text)

Giải thích về kịch bản:

  • Lấy trang web: Kịch bản gửi một LẤY yêu cầu lấy nội dung HTML từ trang web.
  • Chọn khối sản phẩm: Bài viết.sản phẩm_pod Bộ chọn CSS nhắm vào mục nhập cuốn sách đầu tiên.
  • Trích xuất văn bản tiêu đề: Sử dụng h3 a::attr(tiêu đề), tập lệnh kéo thuộc tính tiêu đề từ <a> thẻ lồng nhau trong <h3> nhãn.
  • Hiển thị kết quả: Tiêu đề được trích xuất sẽ được in ra bảng điều khiển.

Ví dụ đầu ra

Tiêu đề văn bản : Ánh sáng trên gác xép

Trích xuất các thuộc tính (ví dụ: `href`, `src`, `alt`)

Parsel cũng cho phép chúng ta trích xuất các giá trị thuộc tính, chẳng hạn như href, src hoặc alt, từ các phần tử HTML. Các thuộc tính này thường chứa dữ liệu có giá trị như URL, nguồn hình ảnh hoặc văn bản mô tả.

Chúng tôi sẽ tập trung vào việc trích xuất liên kết (href) đến trang chi tiết của một cuốn sách từ <a> gắn thẻ bên trong một bài báo phần tử với lớp sản phẩm_pod.

Dưới đây là một ví dụ về cấu trúc HTML của nó:

Từ phần tử này, chúng ta sẽ trích xuất:

  • Liên kết (href) đến trang chi tiết của cuốn sách

Ví dụ về mã Python

nhập yêu cầu từ parsel nhập Selector # Lấy trang web url = "https://books.toscrape.com/" response = requests. get (url) selector = Selector(response.text) # Chọn sản phẩm đầu tiên theo lớp product = selector.css( "article.product_pod" ). get () # Phân tích thuộc tính 'href' từ sản phẩm đã chọn product_selector = Selector( text =product) book_link = product_selector.css( "h3 a::attr(href)" ). get () print ( "Liên kết sách:" , book_link)

Giải thích về kịch bản:

  • Lấy trang web: Tập lệnh gửi yêu cầu GET để lấy nội dung HTML từ trang web.
  • Chọn khối sản phẩm: Bộ chọn CSS article.product_pod nhắm mục tiêu vào mục sách đầu tiên.
  • Trích xuất thuộc tính href: Sử dụng h3 a::attr(href), tập lệnh sẽ kéo giá trị href từ thẻ lồng trong thẻ.
  • Hiển thị kết quả: URL đã trích xuất sẽ được in ra bảng điều khiển.

Ví dụ đầu ra

Liên kết sách: catalog/a-light-in-the-attic_1000/index.html

Trích xuất danh sách các phần tử

Parsel giúp trích xuất nhiều phần tử từ một trang web bằng cách sử dụng bộ chọn CSS hoặc XPath. Điều này đặc biệt hữu ích khi làm việc với các danh sách, chẳng hạn như tiêu đề sản phẩm, liên kết hoặc giá.

Chúng tôi sẽ tập trung vào việc trích xuất danh sách tất cả các tựa sách được hiển thị trên trang chủ của trang web mẫu mà chúng tôi đang sử dụng cho hướng dẫn này.

Dưới đây là một ví dụ về cấu trúc HTML có liên quan:

Từ những yếu tố này, chúng ta sẽ trích xuất:

  • Tiêu đề của tất cả các cuốn sách được hiển thị trên trang chủ

Ví dụ về mã Python

yêu cầu nhập từ parsel nhập Selector # Lấy trang web url = "https://books.toscrape.com/" response = requests. get (url) selector = Selector(response.text) # Chọn tất cả các tựa sách book_titles = selector.css( "article.product_pod h3 a::attr(title)" ).getall() # In từng tựa sách cho tựa sách trong book_titles: print ( "Title:" , title)

Giải thích về kịch bản:

  • Lấy trang web: Kịch bản gửi một LẤY yêu cầu lấy nội dung HTML từ trang web.
  • Chọn tất cả các tiêu đề: Sử dụng CSS bộ chọn bài viết.product_pod h3 a::attr(tiêu đề), nó chọn tất cả <a> thẻ bên trong <h3> thẻ trong sản phẩm_pod các yếu tố.
  • Trích xuất tiêu đề: Các .getall() phương pháp này lấy danh sách tất cả các tiêu đề khớp.
  • Hiển thị kết quả: Mỗi tiêu đề trong danh sách được in ra từng cái một.

Ví dụ đầu ra

Tiêu đề: Ánh sáng trên gác xép Tiêu đề: Tipping the Velvet Tiêu đề: Soumission Tiêu đề: Vật sắc nhọn

Điều hướng các phần tử lồng nhau

Parsel cho phép điều hướng hiệu quả các cấu trúc HTML phức tạp, lồng nhau bằng cách sử dụng bộ chọn CSSXPath . Điều này đặc biệt có giá trị khi trích xuất dữ liệu ẩn sâu trong nhiều lớp thẻ HTML.

Chúng tôi sẽ trích xuất giá của một cuốn sách từ bên trong sản phẩm_pod yếu tố.

Dưới đây là một ví dụ về cấu trúc HTML có liên quan:

Từ cấu trúc lồng nhau này, chúng ta sẽ trích xuất:

  • Giá của cuốn sách đầu tiên

Ví dụ về mã Python

yêu cầu nhập từ parsel nhập Selector # Lấy trang web url = "https://books.toscrape.com/" response = requests. get (url) selector = Selector(response.text) # Chọn sản phẩm đầu tiên theo lớp product = selector.css( "article.product_pod" ). get () # Phân tích cú pháp phần tử giá lồng nhau product_selector = Selector( text =product) price = product_selector.css( "div.product_price p.price_color::text" ). get () print ( "Giá:" , price)

Giải thích về kịch bản:

  • Lấy trang web: Tập lệnh này lấy nội dung HTML của trang web bằng cách sử dụng các yêu cầu.
  • Chọn khối sản phẩm đầu tiên: Nó nhắm mục tiêu vào thẻ bài viết đầu tiên với lớp sản phẩm_pod.
  • Điều hướng đến phần tử giá lồng nhau: Sử dụng CSS bộ chọn div.giá_sản_phẩm_p.giá_màu, nó điều hướng vào div và chọn P thẻ chứa giá.
  • Trích xuất văn bản giá: Các .lấy() phương pháp lấy lại giá trị giá.
  • Hiển thị kết quả: Giá đã trích xuất sẽ được in ra.

Ví dụ đầu ra

Giá : £ 51.77

Phân tích bảng và danh sách

Parsel đơn giản hóa quá trình trích xuất dữ liệu có cấu trúc từ danh sách HTML và các định dạng giống bảng. Các trang web thường hiển thị thông tin theo các mẫu lặp lại, chẳng hạn như lưới sản phẩm hoặc danh sách có thứ tự, khiến Parsel trở thành công cụ thiết yếu để thu thập dữ liệu này một cách hiệu quả.

Ví dụ, chúng ta sẽ làm việc lại với cùng một trang web ví dụ. Mục tiêu của chúng tôi là trích xuất danh sách các tựa sách cùng với giá của chúng. Cụ thể, chúng tôi sẽ nhắm mục tiêu <ol> thẻ, chứa nhiều <li> các thành phần, mỗi thành phần đại diện cho một cuốn sách riêng lẻ.

Dưới đây là một ví dụ về cấu trúc HTML có liên quan:

Từ cấu trúc này, chúng ta sẽ trích xuất:

  • Tiêu đề của mỗi cuốn sách
  • Giá của mỗi cuốn sách

Ví dụ về mã Python

import requests
from parsel import Selector

# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Select all book items in the list
books = selector.css("ol.row li.article")

# Loop through each book and extract title and price
for book in books:
    title = book.css("h3 a::attr(title)").get()
    price = book.css("p.price_color::text").get()
    print(f"Title: {title} | Price: {price}")

Giải thích về kịch bản:

  • Lấy trang web: Tập lệnh gửi yêu cầu GET để lấy nội dung HTML từ trang web.
  • Chọn tất cả các mục sách: Bộ chọn ol.row li.bài viết nhắm vào tất cả <li> các phần tử bên trong danh sách có thứ tự (<ol>), biểu thị từng mục sách riêng lẻ.
  • Trích xuất tiêu đề và giá: h3 a::attr(tiêu đề) trích xuất thuộc tính tiêu đề của <a> nhãn. --- p.giá_màu::văn bản trích xuất văn bản giá từ <p> nhãn.
  • Hiển thị kết quả: Tập lệnh in ra tên và giá của từng cuốn sách.

Ví dụ đầu ra

Tiêu đề: Ánh sáng trên gác xép | Giá: 51,77 bảng Anh Tiêu đề: Tipping the Velvet | Giá: 53,74 bảng Anh Tiêu đề: Soumission | Giá: 50,10 bảng Anh Tiêu đề: Vật sắc nhọn | Giá: 47,82 bảng Anh ...

Phần kết luận

Trong hướng dẫn này, chúng tôi đã khám phá những điều cơ bản về phân tích cú pháp web trong Python với Parsel . Từ việc hiểu các bộ chọn cơ bản đến điều hướng các phần tử lồng nhau, trích xuất các thuộc tính và phân tích cú pháp danh sách, chúng tôi đã chứng minh cách Parsel đơn giản hóa quy trình trích xuất dữ liệu có ý nghĩa từ các trang web.

Sau đây là bản tóm tắt nhanh về những nội dung chúng tôi đã đề cập:

  • Trích xuất các phần tử theo ID và lớp: Nhắm mục tiêu vào các phần tử HTML cụ thể bằng cách sử dụng bộ chọn CSS.
  • Trích xuất văn bản và thuộc tính: Học cách trích xuất nội dung văn bản và các thuộc tính như href và src từ các phần tử.
  • Xử lý các phần tử lồng nhau: Khám phá cách điều hướng thông qua các mối quan hệ cha-con trong cấu trúc HTML.
  • Phân tích danh sách: Trích xuất dữ liệu có cấu trúc từ các mẫu lặp lại, chẳng hạn như bảng hoặc danh sách sản phẩm.

Các bước tiếp theo:

  • Thử nghiệm với nhiều trang web và cấu trúc HTML phức tạp khác nhau bằng Parsel.
  • Khám phá khả năng tích hợp với các thư viện khác như Scrapy cho các dự án thu thập dữ liệu web quy mô lớn.
  • Thực hiện các biện pháp tốt nhất để thu thập dữ liệu có đạo đức, chẳng hạn như tôn trọng tệp robots.txt và tránh làm quá tải máy chủ.

Parsel là một công cụ mạnh mẽ trong bộ công cụ thu thập dữ liệu web và việc thành thạo công cụ này sẽ mở ra vô số cơ hội để thu thập và phân tích dữ liệu.

Chúc bạn phân tích vui vẻ!