如何在Python的Selenium中通过部分ID定位元素?
问题:使用Selenium定位带动态后缀ID的天气数据元素
目标网站的天气数据元素HTML结构如下:
<div id="tdatmo1-FFrad6Noeud-20240225-0700" name="tdatmo1-FFrad6Noeud-20240225-0700" class="container_value "> <div class='box-offset'>10</div> </div> <div id="tdatmo1-FFrad6Noeud-20240225-0654" name="tdatmo1-FFrad6Noeud-20240225-0654" class="container_value "> <div class='box-offset'>9</div> </div> <div id="tdatmo1-FFrad6Noeud-20240225-0648" name="tdatmo1-FFrad6Noeud-20240225-0648" class="container_value "> <div class='box-offset'>7</div> </div>
元素ID前缀固定为tdatmo1-FFrad6Noeud,后半段随日期时间动态变化。使用driver.find_elements(By.ID, "tdatmo1-FFrad6Noeud")无法定位元素,尝试driver.find_element(By.XPATH, "//*[contains(@id, 'tdatmo1-FFrad6Noeud')]")得到了WebElement对象,但不确定结果是否符合预期,也不知道如何提取实际数据。
解决方法
1. 理解之前的XPath问题
你用的find_element()是单数方法,只会返回第一个匹配到的元素,如果要获取所有时间点的天气数据,必须用find_elements()(复数)。另外,用contains()可能匹配到包含该字符串但不是前缀的ID,推荐用更精准的starts-with()来匹配ID前缀。
2. 正确的定位与数据提取方式
方式一:XPath定位(精准匹配前缀)
# 获取所有ID以指定前缀开头的元素 elements = driver.find_elements(By.XPATH, "//div[starts-with(@id, 'tdatmo1-FFrad6Noeud')]") # 遍历元素提取天气数值 weather_values = [] for elem in elements: # 定位内部的.box-offset子元素,获取文本内容 value = elem.find_element(By.CLASS_NAME, "box-offset").text weather_values.append(value) print(weather_values) # 输出示例:['10', '9', '7']
方式二:CSS选择器(更简洁高效)
CSS选择器中^=表示属性值以指定字符串开头,语法更简洁:
# 获取所有ID前缀匹配的元素 elements = driver.find_elements(By.CSS_SELECTOR, "div[id^='tdatmo1-FFrad6Noeud']") # 用列表推导式快速提取数值 weather_values = [elem.find_element(By.CLASS_NAME, "box-offset").text for elem in elements] print(weather_values)
3. 关键说明
PARTIAL_LINK_TEXT不适用:该方法仅针对<a>标签的链接文本,你的目标元素是<div>,完全不适用。- WebElement只是元素引用:拿到WebElement对象后,需要进一步定位子元素或调用
.text等方法,才能获取实际的天气数值。
内容的提问来源于stack exchange,提问作者Alex Fischer
相关产品推荐
相关产品推荐

