因为我想查看每个 class='num' 内的文本是否大于 0。
如果测试通过,那么我需要获取venuen-name 内的文本。我观察到,data-v 是相同的。所以我的方法是获取相同的 data-v-<hash value> 来查找场地名称。我尝试了不同的方法来提取,但仍然无法提取。有什么建议吗?
这是 DOM
<div data-v-3122d63c="" class="el-row chooseTime" data-v-012d0593="">
<div data-v-3122d63c="" class="el-col el-col-5 el-col-xs-0">
<img data-v-174fb000="" data-v-3122d63c=""
src="https://lcsd-smartplay.oss-cn-hongkong.aliyuncs.com/pic/default_facility.jpeg" alt="smartplay"
class="venuen-img">
</div>
<div data-v-3122d63c="" class="el-col el-col-9 el-col-xs-24">
<h3 data-v-3122d63c="" class="venuen-name">foo</h3>
</div>
<div data-v-3122d63c="" class="el-col el-col-10 el-col-xs-24">
<div data-v-3122d63c="" class="el-row">
<div data-v-3122d63c="" class="site el-col el-col-24">boo</div>
<div data-v-3122d63c="" class="el-col el-col-24 el-col-xs-24" style="padding: 2px 0px;">
<div data-v-752ea580="" data-v-3122d63c="" class="facilities-date-list-box">
<div data-v-42c8b4a0="" data-v-752ea580="">
<div data-v-42c8b4a0="" class="smart-play-mobile">
</div><!----><!----><!---->
<div data-v-42c8b4a0="" class="smart-play-mobile-tablet">
</div>
</div>
<div data-v-752ea580="" class="facilities-date-list-hidden scroll-wrap-223-308">
<div data-v-752ea580="" class="facilities-date-list-scroll scroll-223-308">
<div data-v-752ea580="" class="facilities-date-list-item">
<div data-v-752ea580="" class="relative item-num-box-disable">
<div data-v-752ea580="" class="time flex">yyy</div>
<div data-v-752ea580="" class="num">0</div><!---->
</div>
</div>
<div data-v-752ea580="" class="facilities-date-list-item">
<div data-v-752ea580="" class="relative item-num-box-disable">
<div data-v-752ea580="" class="time flex">xxx</div>
<div data-v-752ea580="" class="num">0</div><!---->
</div>
</div>
<div data-v-752ea580="" class="facilities-date-list-item">
<div data-v-752ea580="" class="relative item-num-box-disable">
<div data-v-752ea580="" class="time flex">zzz</div>
<div data-v-752ea580="" class="num">0</div><!---->
</div>
</div>
<div data-v-752ea580="" class="facilities-date-list-item">
<div data-v-752ea580="" class="relative item-num-box-disable">
<div data-v-752ea580="" class="time flex">qqq</div>
<div data-v-752ea580="" class="num">0</div><!---->
</div>
</div>
<div data-v-752ea580="" class="facilities-date-list-item">
<div data-v-752ea580="" class="relative item-num-box-disable">
<div data-v-752ea580="" class="time flex">qqq</div>
<div data-v-752ea580="" class="num">0</div><!---->
</div>
</div>
</div>
</div>
<div data-v-42c8b4a0="" data-v-752ea580="">
<div data-v-42c8b4a0="" class="smart-play-mobile"></div><!----><!----><!---->
<div data-v-42c8b4a0="" class="smart-play-mobile-tablet"></div>
</div>
</div>
</div>
</div>
</div>
</div>
for element in driver.find_elements(By.CLASS_NAME, 'num'):
if int(element.text) == 1:
vue_hash = element.find_element(By.XPATH, "./ancestor::div[contains(@data-v-,'')]").text
你现在的思路是正确的,只是在使用
ancestor::div[contains(@data-v-,'')]
定位祖先元素时,没有指定具体的
data-v-
值。
为了解决这个问题,你可以采取以下两种方法:
方法一:使用更具体的XPath定位祖先元素
你可以使用更具体的XPath表达式,例如
./ancestor::div[contains(@class, 'chooseTime') and contains(@data-v-, '')]
,来定位包含
class='chooseTime'
和
data-v-
属性的祖先元素。
修改后的代码如下:
for element in driver.find_elements(By.CLASS_NAME, 'num'):
if int(element.text) == 1:
# 找到包含 'chooseTime' 类和 'data-v-' 属性的祖先元素
ancestor_element = element.find_element(
By.XPATH, "./ancestor::div[contains(@class, 'chooseTime') and contains(@data-v-, '')]"
)
# 获取祖先元素的 'data-v-' 属性值
vue_hash = ancestor_element.get_attribute("data-v-")
# 找到拥有相同 'data-v-' 属性值的 'venuen-name' 元素
venue_name_element = driver.find_element(
By.XPATH, f"//h3[@class='venuen-name' and ancestor::div[@data-v-'{vue_hash}']]"
)
# 获取场地名称
venue_name = venue_name_element.text
print(venue_name)
方法二:遍历所有祖先元素并检查 'data-v-' 属性
你可以遍历所有祖先元素,并检查其
data-v-
属性是否等于目标值。
修改后的代码如下:
for element in driver.find_elements(By.CLASS_NAME, 'num'):
if int(element.text) == 1:
# 遍历所有祖先元素
current_element = element
while current_element.tag_name != 'html':
current_element = current_element.find_element(By.XPATH, "..")
vue_hash = current_element.get_attribute("data-v-")
if vue_hash is not None:
# 找到 'venuen-name' 元素
venue_name_element = driver.find_element(
By.XPATH, f"//h3[@class='venuen-name' and ancestor::div[@data-v-'{vue_hash}']]"
)
# 获取场地名称
venue_name = venue_name_element.text
print(venue_name)
break
这两种方法都可以帮助你找到拥有相同
data-v-
属性值的
venuen-name
元素。 选择哪种方法取决于你的具体情况和个人偏好。