如何在Selenium中刮掉被另一个元素覆盖的元素?

问题描述 投票:0回答:1

我正在尝试抓取一些数据,但我需要的 div 元素被带有链接的元素覆盖。当尝试使用此代码时:

pts1 = []
pts2 = []

table = driver.find_elements(By.XPATH, '//article[contains(@class,"game-card-view")]')
for match in table:
    pts1.append(driver.find_element(By.XPATH, './div/div[3]/div[1]/span').text)
    pts2.append(driver.find_element(By.XPATH, './div/div[3]/div[2]/span').text)

我收到 NoSuchElementException。没有 iframe,xpath 是正确的。问题似乎是我需要的东西在另一个元素后面:

<article class="game-card-view">
    **<a href="URL">**
    <div>
        <div>
        <div>
        <div>
            <div>
                <span>
            <div>
                <span>

我的猜测是该元素是我无法抓取所需数据的原因,因为它覆盖了整个 div 元素。有没有办法绕过该元素?

python selenium-webdriver web-scraping
1个回答
0
投票

当一个元素被另一个元素覆盖时,使用 Selenium 刮掉它可能会很困难。以下是一些帮助您克服这一障碍的策略:

1。使用

ActionChains
将鼠标悬停在覆盖元素上: 创建一个
ActionChains
实例并使用
move_to_element
方法将鼠标悬停在覆盖元素上。这可以帮助揭示底层元素。

from selenium.webdriver.common.action_chains import ActionChains

actions = ActionChains(driver)
covering_element = driver.find_element_by_css_selector('#covering_element')
actions.move_to_element(covering_element).perform()

2。使用

execute_script
将元素置于最前面: 使用 JavaScript 将底层元素置于前面,方法是将其
z-index
属性设置为比覆盖元素更高的值。

driver.execute_script("arguments[0].style.zIndex = 1000;", element)

3.使用

JavaScriptExecutor
滚动到元素: 使用 JavaScript 滚动到底层元素,这有助于将其带入视图。

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);

4。将

WebDriverWait
expected_conditions
一起使用: 将
WebDriverWait
expected_conditions
一起使用以等待底层元素变得可见或可单击。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, '#underlying_element'))
)

5。使用不同的定位器策略: 尝试使用不同的定位器策略(例如

By.XPath
By.LinkText
)来定位底层元素。

element = driver.find_element_by_xpath("//div[@id='underlying_element']")

6。使用支持

:hover
伪类的浏览器: 如果您使用的是 Chrome 或 Firefox 等浏览器,则可以在覆盖元素悬停时使用
:hover
伪类来定位底层元素。

element = driver.find_element_by_css_selector('#covering_element:hover + #underlying_element')

请记住根据您的具体用例和您正在抓取的网页的结构调整这些策略。

我希望这些建议可以帮助您使用 Selenium 抓取被另一个元素覆盖的元素!

© www.soinside.com 2019 - 2024. All rights reserved.