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.
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ư XPath và CSS . 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.
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:
<h1>
, <p>
, <img>
).nhận dạng
, lớp học
, href
).Bộ chọn XPath và CSS là ngôn ngữ truy vấn được sử dụng để chọn các phần tử trong tài liệu HTML:
Đọc thêm về Selectors tại đây .
Trước khi bắt đầu sử dụng Parsel, hãy đảm bảo những điều sau:
pip cài đặt yêu cầu phân tích cú phá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:
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
yêu cầu đến trang web mẫu để lấy nội dung HTML của trang web đó.bài viết.product_pod
để chọn mục sách đầu tiên trong trang.sản phẩm_pod
khối.Tiêu đề: A Light in the Attic Giá: £ 51,77 Tình trạng: Còn hàng
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:
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)
LẤY
yêu cầu lấy nội dung HTML từ trang web.sản phẩm_pod
Bộ chọn CSS nhắm vào mục nhập cuốn sách đầu tiên.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.Tiêu đề văn bản : Ánh sáng trên gác xép
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:
href
) đến trang chi tiết của cuốn sáchnhậ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:
Liên kết sách: catalog/a-light-in-the-attic_1000/index.html
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:
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
yêu cầu lấy nội dung HTML từ trang web. 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ố..getall()
phương pháp này lấy danh sách tất cả các tiêu đề khớp.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
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 CSS và XPath . Đ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:
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:
sản phẩm_pod
.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á..lấy()
phương pháp lấy lại giá trị giá.Giá : £ 51.77
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:
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}")
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ẻ.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.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 ...
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:
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ẻ!