Thời gian đọc: 6 phút
Trong quá trình tự động hóa web với Selenium, có nhiều trường hợp bạn cần tìm các phần tử dựa trên tên thẻ và thuộc tính (attributes) của chúng. Thay vì phải tìm kiếm riêng lẻ từng loại thẻ hoặc thuộc tính, chúng ta có thể xây dựng một hàm linh hoạt để tìm kiếm bất kỳ thẻ HTML nào với các thuộc tính cụ thể. Hàm này giúp chúng ta tối ưu quá trình tìm kiếm và quản lý các phần tử trong DOM một cách dễ dàng hơn.
Dưới đây là hướng dẫn chi tiết về hàm find_elements_by_tag_and_attributes
, sử dụng Selenium:
def find_elements_by_tag_and_attributes(driver, tag_name="*", attributes={}):
# Tạo query XPath với tên thẻ
xpath_query = f"//{tag_name}"
# Nếu có thuộc tính cần tìm, thêm điều kiện vào query
if attributes:
conditions = []
for attr, value in attributes.items():
# Tìm kiếm giá trị gần đúng cho từng thuộc tính
conditions.append(f"contains(@{attr}, '{value}')")
# Kết hợp các điều kiện thành một chuỗi XPath hoàn chỉnh
xpath_query += f"[{' and '.join(conditions)}]"
# Trả về danh sách các phần tử phù hợp với XPath query
return driver.find_elements_by_xpath(xpath_query)
Hàm find_elements_by_tag_and_attributes
được sử dụng để:
a
, div
, span
, v.v.) và bất kỳ thuộc tính nào (class
, id
, href
, v.v.).Hàm nhận ba tham số chính:
driver
: Đây là đối tượng trình duyệt đang hoạt động trong Selenium, dùng để tương tác với DOM của trang web.tag_name
(mặc định là "*"
) : Tên thẻ HTML cần tìm. Mặc định là "*"
, có nghĩa là tìm tất cả các thẻ. Bạn có thể chỉ định bất kỳ thẻ nào như a
, div
, span
, input
, v.v.attributes
(mặc định là {}
): Là một dictionary chứa các cặp khóa (thuộc tính) và giá trị (giá trị gần đúng của thuộc tính) mà bạn muốn tìm. Ví dụ: { "class": "header", "id": "main" }
.xpath_query = f"//{tag_name}"
: Đây là bước tạo query XPath cơ bản để tìm thẻ HTML dựa trên tên thẻ được truyền vào. Ví dụ, nếu tag_name
là "div"
, query XPath sẽ là "//div"
để tìm tất cả các thẻ div
trong trang web.Nếu attributes
được truyền vào, hàm sẽ tạo một danh sách các điều kiện dựa trên các cặp thuộc tính và giá trị.
for attr, value in attributes.items()
, hàm sẽ duyệt qua từng cặp attr
(thuộc tính) và value
(giá trị gần đúng).contains
của XPath: contains(@{attr}, '{value}')
là cách tìm kiếm trong XPath để kiểm tra xem giá trị của thuộc tính có chứa chuỗi con được chỉ định hay không.
contains(@class, 'header')
sẽ tìm tất cả các thẻ có class chứa chuỗi "header"
.xpath_query += f"[{' and '.join(conditions)}]"
: Nếu có nhiều điều kiện tìm kiếm (nhiều thuộc tính), hàm sẽ nối các điều kiện này lại bằng từ khóa and
để tìm các phần tử thỏa mãn tất cả các điều kiện.return driver.find_elements_by_xpath(xpath_query)
: Sau khi hoàn thành câu query XPath, hàm sẽ sử dụng Selenium để tìm các phần tử thỏa mãn điều kiện và trả về danh sách các phần tử đó.Giả sử bạn đang làm việc trên một trang web và muốn tìm tất cả các thẻ div
có class chứa "example"
và id chứa "header"
. Bạn có thể sử dụng hàm như sau:
driver = webdriver.Chrome()
driver.get("https://example.com")
# Tìm tất cả các thẻ div có class chứa 'example' và id chứa 'header'
attributes = {
"class": "example",
"id": "header"
}
elements = find_elements_by_tag_and_attributes(driver, "div", attributes)
# In ra các thuộc tính của thẻ đã tìm được
for element in elements:
print(element.get_attribute("class"), element.get_attribute("id"))
Hàm sẽ trả về các thẻ div
thỏa mãn điều kiện rằng chúng có:
class
chứa chuỗi "example"
.id
chứa chuỗi "header"
.Hàm find_elements_by_tag_and_attributes
giúp tự động hóa quá trình tìm kiếm các phần tử HTML trong trang web một cách linh hoạt và hiệu quả. Bạn có thể dễ dàng tìm kiếm bất kỳ thẻ nào dựa trên các thuộc tính khác nhau và áp dụng vào nhiều trường hợp khác nhau trong quá trình làm việc với Selenium.