我正在尝试抓取一些数据,但我需要的 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 元素。有没有办法绕过该元素?
当一个元素被另一个元素覆盖时,使用 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 抓取被另一个元素覆盖的元素!