我有以下代码和 HTML 结构(我不是这方面的专家)。
我正在尝试抓取 HTML 代码末尾的 96.00C 元素,其路径是:
Xpath: / /*[@id="_grid"]/set-class 2 /div 2 /text-binding//text() 完整 Xpath:/html/body/main/div/div 3 /div 3 /div/div 3 /div/div/div/div[5 ]/div 3 /div/div 3 /div 2 /div 3 /div 3 /bc -data-grid//div/div 3 /set-class 2 /div 2 /text-binding//text()
I'我能够访问 HTML 代码图像中位于顶部且具有蓝色阴影区域的元素,我将其保存在代码中名为“main”的对象上。问题是,当我尝试访问下面的元素时(以 <bc-data-grid data-ng-hide="error"... 开头的元素,它位于“#shadow-root (打开)”文本)我收到此错误:
为了访问 Selenium 中嵌套影子根内的元素,需要首先导航到每个影子根,然后再定位目标元素。
以下是使用的 HTML 结构和 XPath 的 Python 代码示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 初始化 WebDriver
driver = webdriver.Chrome() # 或者选择的浏览器
# 打开网页
driver.get("YOUR_WEBSITE_URL")
# 等待主元素加载
main_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "_grid"))
)
# 进入第一个影子根
shadow_root_1 = main_element.shadow_root
# 进入第二个影子根
shadow_root_2 = shadow_root_1.find_element(By.CSS_SELECTOR, 'bc-data-grid').shadow_root
# 定位目标元素
target_element = shadow_root_2.find_element(By.XPATH, '//div/div/set-class/div/text-binding')
# 获取元素文本
text = target_element.text
# 打印结果
print(text)
# 关闭浏览器
driver.quit()
代码解释:
- 导入必要的库:
-
webdriver
用于控制浏览器。 -
By
用于定位元素。 -
WebDriverWait
和expected_conditions
用于等待元素加载。 -
初始化 WebDriver 并打开网页: 替换
YOUR_WEBSITE_URL
为实际网址。 -
等待主元素加载: 使用
WebDriverWait
等待 ID 为 "_grid" 的元素出现。 -
进入第一个影子根: 使用
shadow_root
属性访问第一个影子根。 -
进入第二个影子根: 使用
find_element
方法和 CSS 选择器bc-data-grid
定位到第二个影子根的宿主元素,然后再次使用shadow_root
属性进入。 -
定位目标元素: 使用提供的 XPath 定位目标元素。
-
获取元素文本: 使用
text
属性获取元素的文本内容。 -
打印结果: 将提取的文本打印到控制台。
-
关闭浏览器: 使用
driver.quit()
关闭浏览器。
注意事项:
- 确保使用的 XPath 是正确的,并且能够唯一地标识目标元素。
-
如果页面加载需要时间,请调整
WebDriverWait
的超时时间 (此处为 10 秒)。 - 某些网站可能会使用多个嵌套的影子根。 在这种情况下,需要重复步骤 4 和 5 直到到达目标元素所在的影子根。
希望这对有所帮助! 如果有任何其他问题,请随时提问。
标签:python,selenium-webdriver,web-scraping From: 78818215