You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Selenium抓取Shadow Root(open)中的网页最后更新日期及报错解决

解决Selenium中ShadowRoot无法使用find_element_by_xpath的问题

我来帮你搞定这个问题!你碰到的这个AttributeError其实是Selenium的一个小限制——ShadowRoot对象根本不支持find_element_by_xpath这种旧式的定位方法,得换两种更合适的方式来处理:

问题根源

你写的shadow_root1.find_element_by_xpath('dx-container/div')报错,核心原因是:Selenium的ShadowRoot实例只支持通过find_element()配合By类的定位策略,或者直接用JavaScript查询内部元素,不支持find_element_by_xpath这类直接的方法调用。

解决方案

方法一:用CSS选择器精准定位(推荐)

直接用CSS选择器定位到data-id="updated"的div,比XPath更简洁高效:

from selenium.webdriver.common.by import By
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())

# 从txt文件读取URL
with open('url.txt', 'r') as f:
    url = f.read().strip()

driver.get(url)

def expand_shadow_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root

# 用你提供的完整XPath定位dx标签
root1 = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div[3]/div/div[2]/dx')
shadow_root1 = expand_shadow_element(root1)

# 定位到更新日期的div,提取内容
updated_element = shadow_root1.find_element(By.CSS_SELECTOR, 'div[data-id="updated"]')
# 去掉前缀,只保留日期部分
last_update_date = updated_element.text.split(': ')[1]
print(f"最后更新日期:{last_update_date}")

driver.quit()

方法二:通过JavaScript执行XPath查询(如果你偏好XPath)

如果一定要用XPath,可以通过execute_script让JavaScript在ShadowRoot内部执行查询:

# ... 保留初始化和shadow root获取的代码
updated_element = driver.execute_script("""
    // 在shadow root内用XPath查找目标元素
    return arguments[0].evaluate(
        'dx-container/div[@data-id="updated"]', 
        arguments[0], 
        null, 
        XPathResult.FIRST_ORDERED_NODE_TYPE, 
        null
    ).singleNodeValue;
""", shadow_root1)

last_update_date = updated_element.text.replace('Last Updated: ', '')
print(last_update_date)

额外优化建议

为了避免页面未加载完全导致的元素找不到问题,建议加入等待逻辑:

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

# 等待dx标签加载完成(最多等10秒)
root1 = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '/html/body/div[2]/div[2]/div[2]/div[3]/div/div[2]/dx'))
)

内容的提问来源于stack exchange,提问作者wamika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:27:43