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

Cách chọn phần tử theo văn bản trong XPath

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

Khi thu thập dữ liệu trang web, bạn thường cần chọn các thành phần trên trang dựa trên nội dung văn bản của chúng. Điều này cho phép bạn nhắm mục tiêu chính xác dữ liệu bạn muốn trích xuất. XPath, một ngôn ngữ truy vấn để chọn các nút trong tài liệu XML và HTML, cung cấp một số cách để thực hiện việc này bằng cách sử dụng contains()text() chức năng.

Trong hướng dẫn này, chúng ta sẽ xem xét sâu hơn cách tận dụng các kỹ thuật chọn văn bản này trong biểu thức XPath của bạn. Chúng tôi sẽ đề cập đến cú pháp, xem qua các ví dụ và thảo luận về một số phương pháp hay nhất để giúp bạn chọn các thành phần theo nội dung văn bản của chúng một cách hiệu quả khi tìm kiếm trên web.

Sử dụng contains() để chọn các phần tử chứa văn bản

XPath contains() hàm cho phép bạn chọn các thành phần có chứa chuỗi con văn bản cụ thể. Phải mất hai đối số:

  1. Một tập hợp nút để tìm kiếm bên trong
  2. Chuỗi con văn bản phù hợp

Cú pháp trông giống như:

//element[contains(text(), "substring")]

Điều này sẽ chọn tất cả element các nút có nội dung văn bản chứa thông tin được chỉ định substring.

Ví dụ: hãy xem xét HTML sau:

<ul>
  <li>Apples</li>
  <li>Oranges</li>
  <li>Pears and Grapes</li>
</ul>

Để chọn tất cả <li> các phần tử chứa văn bản "và", bạn sẽ sử dụng:

//li[contains(text(), "and")]

Điều này sẽ phù hợp với thứ ba <li> yếu tố "Quả lê và nho".

Sản phẩm contains() theo mặc định, hàm này phân biệt chữ hoa chữ thường. Để thực hiện so khớp không phân biệt chữ hoa chữ thường, bạn có thể sử dụng lower-case() or upper-case() chức năng bình thường hóa vỏ:

//li[contains(lower-case(text()), "and")]

Một tính năng chính của contains() là kết quả khớp chuỗi con có thể trải rộng trên các phần tử con. Ví dụ: trong HTML này:

<p>
  Select <em>this</em> paragraph.
</p>

XPath //p[contains(text(), "Select this")] vẫn sẽ phù hợp với <p> thẻ, mặc dù "Chọn" và "cái này" được phân tách bằng dấu <em> phần tử con.

Sử dụng text() để chọn các phần tử theo văn bản chính xác

Trong khi contains() rất hữu ích cho việc khớp một phần văn bản, đôi khi bạn cần khớp chính xác toàn bộ nội dung văn bản. Đây là nơi text() hàm xuất hiện. Nó chọn các thành phần dựa trên nội dung văn bản đầy đủ của chúng.

Cú pháp là:

//element[text()="exact text"]

Ví dụ: với HTML này:

<div>
  <p>Hello world!</p>
  <p>Hello again</p>
</div>

Biểu thức XPath //p[text()="Hello world!"] sẽ chỉ chọn cái đầu tiên <p> yếu tố. Thư hai <p> phần tử không khớp, vì nội dung văn bản của nó không chính xác là "Xin chào thế giới!".

Không giống như contains(), Các text() hàm chỉ khớp với nội dung văn bản trực tiếp của một phần tử. Nó không khớp với văn bản trong các phần tử con. Ví dụ, //div[text()="Hello world!"] sẽ không khớp với bất cứ thứ gì trong HTML ở trên, bởi vì <div> bản thân nó không chứa trực tiếp dòng chữ "Xin chào thế giới!". Văn bản đó nằm trong <p> phần tử con.

Như contains(), Các text() theo mặc định, hàm này phân biệt chữ hoa chữ thường. Giống nhau lower-case() or upper-case() cách giải quyết khác có thể được sử dụng để kết hợp không phân biệt chữ hoa chữ thường.

Kết hợp bộ chọn văn bản với các biểu thức XPath khác

Bộ chọn văn bản thậm chí còn trở nên mạnh mẽ hơn khi được kết hợp với các phần khác của biểu thức XPath, chẳng hạn như tên thẻ, thuộc tính và bộ chọn vị trí. Điều này cho phép bạn tạo các bộ chọn được nhắm mục tiêu cụ thể để đi sâu vào chính xác các yếu tố bạn cần.

Ví dụ: bạn có thể sử dụng XPath sau để chọn <a> các phần tử chứa từ "nhấp chuột" trong văn bản liên kết của chúng, nhưng chỉ khi chúng cũng có lớp "cta-button":

//a[contains(text(), "click") and @class="cta-button"]

Hoặc biểu thức này để chọn thứ ba <p> trên trang nhưng chỉ khi nội dung văn bản của nó bắt đầu bằng "Giới thiệu":

//p[starts-with(text(), "Introduction")][3]

Bằng cách trộn và kết hợp các cấu trúc XPath khác nhau, bạn có thể xây dựng các bộ chọn rất cụ thể để xử lý hầu hết mọi tình huống quét web.

Ví dụ về bộ chọn văn bản với thư viện Python

Hãy xem một số ví dụ thực tế về cách sử dụng bộ chọn văn bản XPath với các thư viện quét web Python phổ biến.

Ví dụ với lxml và yêu cầu

import requests
from lxml import html

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
tree = html.fromstring(page.content)

# Select all <a> elements that contain the text "click me"
links = tree.xpath(‘//a[contains(text(), "click me")]‘)

# Print the href attribute of each selected link
for link in links:
    print(link.get(‘href‘))

Ví dụ với BeautifulSoup

import requests
from bs4 import BeautifulSoup

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
soup = BeautifulSoup(page.content, ‘html.parser‘)

# Select the first <p> element that starts with the text "Introduction"
intro_para = soup.select_one(‘p[text^="Introduction"]‘)

print(intro_para.text)

Ví dụ với Selenium

from selenium import webdriver
from selenium.webdriver.common.by import By

# Launch a browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get(‘https://example.com‘)

# Select the <button> element with the exact text "Submit"
submit_button = driver.find_element(By.XPATH, ‘//button[text()="Submit"]‘)

submit_button.click()

Mẹo và Thực tiễn Tốt nhất

Khi sử dụng bộ chọn văn bản XPath để tìm kiếm trên web, hãy ghi nhớ những mẹo sau:

  1. Hãy lưu ý đến khoảng trắng trong văn bản bạn đang cố gắng khớp. Dấu cách thừa hoặc ký tự dòng mới có thể khiến bộ chọn của bạn không thành công. Sử dụng normalize-space() để xóa khoảng trắng ở đầu và cuối cũng như thu gọn khoảng trắng bên trong nếu cần.

  2. Hãy chú ý đến cách viết hoa. Theo mặc định, việc khớp văn bản trong XPath có phân biệt chữ hoa chữ thường. Sử dụng chữ thường() hoặc chữ hoa() để khớp không phân biệt chữ hoa chữ thường.

  3. Tránh các bộ chọn văn bản quá chung chung vì chúng có thể khớp với các phần tử ngoài ý muốn. Cố gắng kết hợp bộ chọn văn bản với tên thành phần hoặc thuộc tính để làm cho chúng cụ thể hơn.

  4. Luôn kiểm tra bộ chọn của bạn dựa trên nội dung trang hiện tại, thực tế. Các trang web thay đổi thường xuyên nên các bộ chọn hoạt động hôm qua có thể không hoạt động hôm nay nếu nội dung văn bản đã được cập nhật.

  5. Nếu trang web có định dạng không nhất quán hoặc nội dung do người dùng tạo thì bộ chọn văn bản có thể không đáng tin cậy. Trong những trường hợp này, tốt hơn hết bạn nên sử dụng bộ chọn cấu trúc dựa trên tên phần tử, thuộc tính hoặc vị trí trong cây tài liệu.

Kết luận

XPath cung cấp những cách thức mạnh mẽ để chọn các phần tử dựa trên nội dung văn bản của chúng, bằng cách sử dụng contains()text() chức năng. contains() rất hữu ích để khớp các phần tử có chứa một chuỗi con văn bản cụ thể, trong khi text() chọn các phần tử theo nội dung văn bản đầy đủ, chính xác của chúng.

Các bộ chọn văn bản này thậm chí còn hiệu quả hơn khi được kết hợp với các biểu thức XPath khác để tạo ra các bộ chọn phần tử được nhắm mục tiêu cao để quét web.

Ngoài chỉ contains()text(), XPath có một số hàm hữu ích khác để làm việc với văn bản, chẳng hạn như starts-with(), ends-with(), normalize-space(), và hơn thế nữa. Đầu tư chút thời gian vào việc tìm hiểu những phần này và các phần quan trọng khác của cú pháp XPath.

Với sự hiểu biết vững chắc về bộ chọn văn bản XPath, bạn đang dần có thể nhắm mục tiêu và trích xuất chính xác dữ liệu bạn cần từ các trang web. 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 *