2016-03-26 5 views
1

私は今月と来月に利用できずに利用可能なカレンダーデータをすべて取得しようとしています。私は分裂を得ることに運がなかった。私が使用したコードは以下の通りです。私はそれらの日付が利用可能であるか利用不可能であるかを識別する属性を持たないすべての日付を取得できるか、または反復しようとするとエラーが発生する "selenium.common.exceptions.StaleElementReferenceException:メッセージ:要素はもはやDOM "Python2.7でSeleniumを使用してウェブサイトのカレンダーデータを取得しようとしています

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

2つのこと:

  • 日付ピッカーは、右ボタンクリックで表示されますが、それはロードに時間がかかる - ある日のかを決定するためにそれのために
  • を待ちます

    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) 
    
    :利用できない、ui-datepicker-unselectableクラス

実装の有無を使います

プリント:

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 
+0

ありがとうございます!私は3つのフォローアップの質問があったと思う:(1)なぜ日付を得るためにCSSセレクターが良いですか? (2)次の月のボタンをクリックすると、それはボタンのように見えないので、(3)その月の値を引き出す方法があるので、月の日の可用性のようなものを得るでしょう – FancyDolphin

+0

@FancyDolphin(1)それは必ずしも良いとは言えませんが(多くの人がそう言っていますが)、一般的にはブラウザによってはより簡潔で高速です(2)カレンダーの上部にある「a」リンクは月を変更する、右(3)よく、あなたはすでに日を知っている、月はここにある: ' 3月' - あなたが次に何をしようとしているかに応じて、 date/datetimeオブジェクトの日付は有益かもしれませんが、おそらくこれは別の質問の一部です。ありがとうございます。 – alecxe

+0

ルーキーの質問で私を助けてくれてありがとうもう一度 – FancyDolphin

関連する問題