使用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
相关产品推荐
相关产品推荐

