使用Selenium通过属性在Python中识别网页元素

1 投票
1 回答
33 浏览
提问于 2025-04-14 17:43

Python版本 3.12.0,Selenium版本 4.17.2,Chrome版本 121.0.6167.160(官方版)(arm64),Macbook Air操作系统版本 14.2.1(23C71)

你好,

我刚接触Selenium和HTML。我正在尝试写一个简单的网球场预约脚本,目标是一个叫“gotcourts.com”的网站,这个网站上有我网球俱乐部的预约表。下面有这个网页的图片和相关的HTML代码。总共有11个球场,前8个是外场,最后3个是内场。外场的5到8号在冬季不开放,所以它们被标记为不可用。

我想通过calendarRow来识别一个内场(这样我可以找到正确的球场),通过title来获取正确的时间,并返回class的值(这样我可以在点击之前判断这个球场是否已经被预约)。注意,class的值会根据球场的状态变化,如果球场不可用、已预约或(默认情况下)可用,class的值会不同。

我花了很多时间在这上面,但一直没能搞明白怎么做。我的最近尝试是:

courts = driver.find_elements(By.XPATH,"//div[@class='calendarSlots']/div[@class='calendarSlotsForSport']/div[@class='calendarRow']/div[@title='15:00']")

有趣的是,这里只有7个元素(因为维修中的球场的calendarRows没有被包括在内——我不明白为什么)

courts = driver.find_element(By.XPATH,"//div[@class='calendarSlots']/div[@class='calendarSlotsForSport']/div[@class='calendarRow'][9]")
courts2 = courts.find_element(By.CSS_SELECTOR,'[title="15:00"]')
print("courts2: ",courts2)

这段代码打印出一个元素:

courts2: <selenium.webdriver.remote.webelement.WebElement (session="98c13f451089026fb91ddef4e1d8e21e", element="f.76106E64D664766C5D798D2DFF30079D.d.30B03448A41BC22026B8BBA64E0617A0.e.180")>

但是当我把打印语句改成:

print("courts2: ",courts2.get_attribute('innerHTML'))

却什么都没打印出来。

非常感谢任何关于我应该写什么以达到目标的指导,或者对我做错了什么的提示,我将不胜感激。

网页预约日历及相关HTML。

1 个回答

0

从你发的HTML来看,这看起来像是一个CSS选择器

div.available

它会找到所有的空闲时间段。接下来,你可以做一些事情,比如打印出所有可用的时间?比如说,

slots = driver.find_elements(By.CSS_SELECTOR, "div.available")
print("Time slots open today:")
for slot in slots:
    print("  " + slot.get_attribute("title"))

这样就应该会打印出类似这样的内容

Time slots open today:
  13:00
  14:00
  15:00
  ...

撰写回答