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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:39