使用Selenium通过属性在Python中识别网页元素
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'))
却什么都没打印出来。
非常感谢任何关于我应该写什么以达到目标的指导,或者对我做错了什么的提示,我将不胜感激。
1 个回答
从你发的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
...