尝试在python2.7中使用Selenium获取网站日历数据

时间:2016-03-26 10:26:16

标签: python python-2.7 selenium-webdriver web-scraping

我正在尝试将所有日历数据拆分为不可用且可用于本月和下个月。得到分裂我没有运气。以下是我用过的代码。我要么能够获得没有属性的所有日期来确定这些日期是可用还是不可用,或者当我尝试迭代时出现错误“selenium.common.exceptions.StaleElementReferenceException:Message:Element不再附加到DOM“

from selenium import webdriver
url = 'https://www.airbnb.com/rooms/4660676'
driver = webdriver.Firefox()
driver.get(url)
element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH,'/html/body/main/div[3]/div[4]/div/div/div[2]/div[4]/div/div[1]/div/form/div/div/div[2]/button'))
)
element.click()
#This one gets me all the dates 
#listitems=driver.find_elements_by_xpath('/html/body/div[35]/table/tbody/tr[5]')

#If I try something like the following to then be able to get get_attribute then I get the error mentioned above
#available=driver.find_elements_by_xpath('//tr')
#for i in available: print i.text

获取日期的方法是什么?感谢。

1 个答案:

答案 0 :(得分:1)

要理解两件事情才能解决问题:

  • 日期选择器出现在单击按钮上,但是加载需要时间 - 等待它
  • 确定哪些日期可用而不是,使用ui-datepicker-unselectable
  • 的存在

实现:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


url = 'https://www.airbnb.com/rooms/4660676'
driver = webdriver.Firefox()
driver.get(url)

wait = WebDriverWait(driver, 10)

# click "Instant Book"
book = wait.until(
    EC.element_to_be_clickable((By.XPATH,'//button[span = "Instant Book"]'))
)
book.click()

# wait for datepicker to load
wait.until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
)

days = driver.find_elements_by_css_selector(".ui-datepicker table.ui-datepicker-calendar tr td")
for cell in days:
    day = cell.text.strip()
    if not day:
        continue

    if "ui-datepicker-unselectable" in cell.get_attribute("class"):
        status = "Unavailable"
    else:
        status = "Available"

    print(day, status)

打印:

1 Unavailable
2 Unavailable
3 Unavailable
4 Unavailable
5 Unavailable
6 Unavailable
7 Unavailable
8 Unavailable
9 Unavailable
10 Unavailable
11 Unavailable
12 Unavailable
13 Unavailable
14 Unavailable
15 Unavailable
16 Unavailable
17 Unavailable
18 Unavailable
19 Unavailable
20 Unavailable
21 Unavailable
22 Unavailable
23 Unavailable
24 Unavailable
25 Unavailable
26 Unavailable
27 Unavailable
28 Available
29 Available
30 Unavailable
31 Unavailable