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

Cách chọn các phần tử theo lớp trong XPath: Hướng dẫn cơ bản

  • by
  • Blog
  • Đã đọc 8 phút

Nếu bạn đang tìm cách trích xuất dữ liệu từ các trang web, rất có thể bạn sẽ cần phải chọn các thành phần cụ thể dựa trên lớp của chúng. Lớp là cách cơ bản để phân loại và tạo kiểu cho các phần tử trong HTML. May mắn thay, XPath cung cấp những cách mạnh mẽ để chọn các phần tử theo thuộc tính lớp của chúng.

Trong hướng dẫn chuyên sâu này, chúng tôi sẽ hướng dẫn chính xác cách chọn các phần tử theo lớp bằng XPath. Cho dù bạn là người mới bắt đầu hay người quét web có kinh nghiệm, thì đến cuối bài viết này, bạn sẽ điều hướng các tài liệu HTML một cách thành thạo và nhắm mục tiêu chính xác các phần tử bạn cần. Bắt đầu nào!

Tóm tắt nhanh về XPath

Trước khi đi sâu vào các bộ chọn lớp, hãy xem lại ngắn gọn XPath là gì và nó hoạt động như thế nào. XPath là ngôn ngữ truy vấn được sử dụng để điều hướng và chọn các nút trong tài liệu XML hoặc HTML. Nó cho phép bạn viết các biểu thức xác định chính xác các thành phần cụ thể dựa trên tên thẻ, thuộc tính, vị trí của chúng, v.v.

Dưới đây là một số điều quan trọng cần biết về XPath:

  • XPath xử lý tài liệu giống như một cấu trúc cây, với nút gốc và các nút con phân nhánh ra khỏi nó
  • Biểu thức được đánh giá từ trái sang phải
  • Dấu gạch chéo (/) được sử dụng để điều hướng giữa các nút
  • Các phần tử có thể được chọn dựa trên tên của chúng (ví dụ: //div chọn tất cả <div> phần tử)
  • Vị từ trong ngoặc vuông cho phép lựa chọn chính xác hơn (ví dụ: //div[@id=‘main‘] chọn <div> các phần tử có id là "chính")

Với nền tảng đó, chúng ta hãy chuyển sự chú ý sang các lớp và cách tận dụng chúng trong các biểu thức XPath.

Hiểu các lớp HTML

Lớp là một thuộc tính HTML cho phép bạn gán một hoặc nhiều tên lớp cho các phần tử. Chúng chủ yếu được sử dụng cho mục đích tạo kiểu với CSS, nhưng cũng rất hữu ích để nhắm mục tiêu các phần tử cụ thể khi quét web.

Đây là một ví dụ về thành phần đoạn văn có hai lớp:

<p class="highlight text-center">This is some text.</p>

Trong trường hợp này, <p> phần tử có hai lớp được áp dụng cho nó: "đánh dấu" và "trung tâm văn bản". Một phần tử có thể có số lượng lớp bất kỳ, được phân tách bằng dấu cách trong giá trị thuộc tính lớp.

Một điều cần lưu ý là tên lớp có phân biệt chữ hoa chữ thường. Vì thế class="highlight"class="Highlight" sẽ được coi là hai lớp khác nhau.

Bây giờ chúng ta đã hiểu lớp HTML là gì, hãy xem cách chúng ta có thể chọn các phần tử dựa trên lớp của chúng bằng XPath.

Chọn các phần tử theo lớp trong XPath

XPath cung cấp hai cách chính để chọn các phần tử theo thuộc tính lớp của chúng:

  1. Sử dụng hàm chứa()
  2. Khớp tên lớp chính xác

Hãy cùng khám phá từng cách tiếp cận này một cách sâu sắc hơn.

Cách tiếp cận 1: Sử dụng hàm contains()

Sản phẩm contains() hàm cho phép bạn chọn các phần tử có thuộc tính lớp chứa một tên lớp cụ thể. Đây là cú pháp cơ bản:

//element[contains(@class,‘classname‘)]

Ví dụ: để chọn tất cả <div> các phần tử có lớp "vùng chứa", bạn sẽ sử dụng:

//div[contains(@class,‘container‘)]  

Sản phẩm contains() chức năng có một số đặc điểm chính:

  • Nó phân biệt chữ hoa chữ thường (vì vậy "container" và "Container" sẽ được coi là khác nhau)
  • Tên lớp có thể xuất hiện ở bất cứ đâu trong giá trị thuộc tính lớp
  • Phần tử này cũng có thể được áp dụng các lớp khác, miễn là nó chứa lớp được chỉ định

So contains(@class,‘container‘) sẽ phù hợp với các yếu tố như:

<div class="container"></div>
<div class="wrapper container card"></div>
<div class="container highlighted"></div>

Nhưng nó sẽ không trận đấu:

<div class="containery"></div>
<div class="wrapper"></div>

Sản phẩm contains() Cách tiếp cận này rất linh hoạt và có thể là một lựa chọn tốt khi bạn muốn so khớp các phần tử có một lớp nhất định như một phần của định của các lớp học. Nhưng nếu bạn cần chính xác hơn, cách tiếp cận tiếp theo có thể thích hợp hơn.

Cách tiếp cận 2: Khớp tên lớp chính xác

Để chọn các phần tử có thuộc tính lớp chính xác khớp với một giá trị cụ thể, bạn có thể sử dụng cú pháp sau:

//element[@class=‘classname‘]

Chẳng hạn, để chọn <p> các phần tử trong đó lớp chính xác là "đánh dấu", bạn sẽ sử dụng:

//p[@class=‘highlight‘]

Biểu thức này sẽ phù hợp:

<p class="highlight"></p>  

Nhưng không:

<p class="highlight text-center"></p>
<p class="highlights"></p>
<p class="Highlight"></p>

Như bạn có thể thấy, cách tiếp cận đối sánh chính xác chặt chẽ hơn. Thuộc tính lớp phải chứa có thể tên lớp được chỉ định để khớp. Không có lớp nào khác có thể có mặt và trường hợp này phải khớp chính xác.

Cách tiếp cận này hữu ích khi bạn cần phải chọn phần tử thật chính xác và muốn tránh các phần tử vô tình trùng khớp có chứa lớp như một phần của tập hợp lớn hơn.

XPath và các lớp – Những cân nhắc chính

Khi sử dụng XPath để chọn các phần tử theo lớp, có một số điều quan trọng cần lưu ý:

  • Tên lớp có phân biệt chữ hoa chữ thường. Như đã đề cập trước đó, "highlight" và "Highlight" được coi là tên lớp riêng biệt. Đảm bảo các biểu thức XPath của bạn khớp chính xác với từng trường hợp.

  • Các phần tử có thể có nhiều lớp. Việc các phần tử được áp dụng nhiều lớp, cách nhau bằng dấu cách là điều rất bình thường. Các contains() cách tiếp cận sẽ khớp với các phần tử miễn là chúng chứa lớp được chỉ định một nơi nào đó trong thuộc tính lớp của họ.

  • Kết hợp chính xác chính xác hơn nhưng kém linh hoạt hơn. Nếu bạn sử dụng [@class=‘classname‘], thuộc tính lớp phải có thể chứa lớp đó. Nếu có các lớp khác được áp dụng, phần tử sẽ không khớp. Ngược lại, contains(@class,‘classname‘) sẽ khớp miễn là lớp đó xuất hiện ở đâu đó trong giá trị thuộc tính.

  • XPath được hỗ trợ bởi hầu hết các công cụ và thư viện quét web. Cho dù bạn đang sử dụng Python với BeautifulSoup hay Scrapy, JavaScript với Puppeteer hay Cheerio hay ngôn ngữ/framework khác, bạn đều có thể sử dụng biểu thức XPath để trích xuất dữ liệu. Cú pháp chọn lớp vẫn giữ nguyên.

  • Hiệu suất quan trọng đối với việc cạo quy mô lớn. Mặc dù XPath rất mạnh nhưng nó cũng có thể chậm hơn các phương pháp khác như bộ chọn CSS, đặc biệt đối với các biểu thức phức tạp hơn. Nếu bạn đang thu thập một số lượng lớn trang, bạn nên so sánh các phương pháp tiếp cận khác nhau để xem phương pháp nào mang lại hiệu suất tốt nhất.

Lời khuyên và thực tiễn tốt nhất về Bộ chọn lớp

Để tận dụng tối đa các bộ chọn lớp XPath, hãy xem xét các mẹo và cách thực hành tốt nhất sau:

  • Sử dụng biểu thức đơn giản nhất để hoàn thành công việc. Đôi khi đơn giản //element[@class=‘classname‘] là tất cả những gì bạn cần. Tránh sự phức tạp không cần thiết.

  • Kết hợp các bộ chọn lớp với các tiêu chí khác khi cần thiết. Bạn có thể sử dụng các vị từ để chọn các phần tử dựa trên nhiều thuộc tính (ví dụ: //button[@class=‘primary‘ and @type=‘submit‘]) hoặc kết hợp các bộ chọn lớp với các bộ chọn vị trí (ví dụ: (//div[@class=‘row‘])[2] để chọn hàng thứ hai).

  • Hãy chú ý đến những thay đổi đối với HTML của trang web. Các lớp thường được sử dụng cho mục đích tạo kiểu, có nghĩa là chúng có thể thay đổi thường xuyên hơn các thuộc tính khác như ID. Nếu công cụ nạo của bạn bị hỏng, hãy kiểm tra kỹ xem các lớp bạn đang nhắm mục tiêu có còn tồn tại trên trang hay không.

  • Sử dụng XPath tương đối để tránh lặp lại các biểu thức dài. Nếu bạn đã chọn phần tử cha, bạn có thể sử dụng dấu chấm (.) để chọn các phần tử con tương ứng với phần tử đó, như //div[@class=‘container‘]/./p.

  • Hãy xem xét các phương pháp khác như bộ chọn CSS hoặc biểu thức chính quy cho các trường hợp sử dụng cụ thể. Mặc dù XPath rất linh hoạt nhưng đôi khi có một cách tiếp cận khác đơn giản hơn hoặc nhanh hơn. Bộ chọn CSS hoạt động hiệu quả và rất phù hợp cho các tác vụ lựa chọn cơ bản. Biểu thức chính quy có thể hữu ích cho việc khớp mẫu hoặc trích xuất dữ liệu từ nội dung văn bản.

Ví dụ về lựa chọn lớp

Chúng ta hãy xem qua một số ví dụ về lựa chọn lớp đang hoạt động bằng cách sử dụng Python và lxml thư viện.

Giả sử chúng ta có HTML này:

<html>
    <body>
        <div class="container">
            <p class="highlight">Paragraph 1</p>
            <p>Paragraph 2</p>
            <p class="highlight">Paragraph 3</p>
        </div>
    </body>  
</html>

Để chọn tất cả <p> các phần tử có lớp "đánh dấu", chúng ta có thể sử dụng contains():

from lxml import html

tree = html.fromstring(html_string)
highlighted_paragraphs = tree.xpath(‘//p[contains(@class,"highlight")]‘)

for paragraph in highlighted_paragraphs:
    print(paragraph.text)

# Output: 
# Paragraph 1
# Paragraph 3

Nếu chúng ta chỉ muốn chọn <p> các phần tử trong đó có lớp chính xác "làm nổi bật", chúng tôi sẽ sử dụng:

exact_match_paragraphs = tree.xpath(‘//p[@class="highlight"]‘)

Để chọn <div> phần tử rồi tìm <p> các phần tử có lớp "đánh dấu" bên trong nó, chúng ta có thể sử dụng XPath tương đối:

div = tree.xpath(‘//div[@class="container"]‘)[0]
highlighted_paragraphs = div.xpath(‘./p[contains(@class,"highlight")]‘)

Putting It All Together

Trong hướng dẫn này, chúng tôi đã xem xét kỹ lưỡng cách chọn các phần tử theo lớp bằng XPath. Chúng tôi đã đề cập đến hai cách tiếp cận chính – sử dụng hàm contains() và khớp tên lớp chính xác – cũng như những cân nhắc chính, cách thực hành tốt nhất và ví dụ.

Để tóm tắt:

  • XPath là ngôn ngữ truy vấn mạnh mẽ để chọn các thành phần trong tài liệu HTML/XML
  • Lớp là một cách gán danh mục cho các thành phần, thường nhằm mục đích tạo kiểu hoặc lựa chọn
  • Sản phẩm contains(@class,‘classname‘) cách tiếp cận chọn các phần tử có chứa lớp được chỉ định như một phần của giá trị thuộc tính lớp của chúng
  • Sản phẩm [@class=‘classname‘] cách tiếp cận chọn các phần tử trong đó thuộc tính lớp khớp chính xác với lớp được chỉ định
  • Bộ chọn lớp XPath phân biệt chữ hoa chữ thường và có thể được kết hợp với các tiêu chí khác hoặc bộ chọn tương đối
  • Điều quan trọng là chọn cách diễn đạt đơn giản nhất để hoàn thành mục tiêu của bạn và lưu ý đến những thay đổi đối với HTML của trang web theo thời gian

Được trang bị kiến ​​thức này, bạn được trang bị đầy đủ để giải quyết nhiều thách thức quét web khác nhau bằng cách sử dụng XPath và bộ chọn lớp. Cho dù bạn là người mới bắt đầu hay một chuyên gia dày dạn kinh nghiệm, hiểu cách nhắm mục tiêu chính xác các yếu tố bạn cần là một kỹ năng cần thiết.

Khi bạn áp dụng những kỹ thuật này vào thực tế, hãy nhớ luôn tôn trọng chủ sở hữu trang web và tuân thủ mọi điều khoản dịch vụ hoặc tệp robots.txt hiện hành. Chúc mừng cạo!

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 *