2

運行我的腳本我得到「javascript:getDetail(19978)」這樣的項目如href。大括號中的數字如果與「https://www.aopa.org/airports/4M3/business/」連接,則產生有效的鏈接。但是,點擊這個新創建的鏈接,我可以看到,它讓我到一個不同的頁面,如果從原始頁面鏈接中點擊,那麼它與該頁面不相似。如何獲取原始鏈接而不是「javascript:getDetail(19978)」。搜索應該在搜索框中寫入「全部」。 代碼我已經試過:我的腳本生成JavaScript的東西而不是有效的鏈接

from selenium import webdriver 
import time 
link = "https://www.aopa.org/airports/4M3/business/" 
driver = webdriver.Chrome() 
driver.get("https://www.aopa.org/learntofly/school/") 

driver.find_element_by_id('searchTerm').send_keys('All') 
driver.find_element_by_id('btnSearch').click() 
time.sleep(5) 
for pro in driver.find_elements_by_xpath('//td/a'): 
    print(pro.get_attribute("href")) 
driver.quit() 

代碼來創建基本URL我在描述粘貼新的鏈接:

from selenium import webdriver 
import time 
link = "https://www.aopa.org/airports/4M3/business/" 
driver = webdriver.Chrome() 
driver.get("https://www.aopa.org/learntofly/school/") 
driver.find_element_by_id('searchTerm').send_keys('All') 
driver.find_element_by_id('btnSearch').click() 
time.sleep(5) 
for item in driver.find_elements_by_xpath('//td/a'): 
    fresh = item.get_attribute("href").replace("javascript:getDetail(","") 
    print(link + fresh.replace(")","")) 
driver.quit() 

然而,這個新創建的鏈接導致我到不同的目的地。

FYC,原來的鏈接嵌入像下面的一個元素中:

<td><a href="javascript:getDetail(19978)">GOLD DUST FLYING SERVICE, INC.</a></td> 
+0

我對於接受哪個答案感到非常困惑,因爲兩個python巨人給出的答案都像魅力一樣工作。 – SIM

+0

如果我出錯了,不要責罵我或採取其他措施。安德森爵士已經給出了答案,所以我會接受它。不過,我已經提出了兩個答案。 – SIM

+1

別擔心。重要的是問題解決了。謝謝你的一個好問題! – alecxe

回答

2

點擊鏈接你作出XHR。頁面實際上保持不變,但從JSON接收到的數據而不是以前的內容。

如果你想打開一個HTML頁面中的原始數據,你可以嘗試像

# To get list of entries as ["19978", "30360", ... ] 
entries = [a.get_attribute('href').split("(")[1].split(")")[0] for a in driver.find_elements_by_xpath('//td/a')] 
url = "https://www.aopa.org/learntofly/school/wsSearch.cfm?method=schoolDetail&businessId=" 
for entry in entries: 
    driver.get(url + entry) 
    print(driver.page_source) 

您也可以使用requests讓每個JSON響應,

import requests 
for entry in entries: 
    print(requests.get(url + entry).json()) 

沒有在瀏覽器中呈現的數據

+0

謝謝安德森先生,您的無懈可擊解決方案。 – SIM

+0

安德森爵士,請給我一個提示,你在哪裏發現了這個「https://www.aopa.org/learntofly/school/wsSearch.cfm?method=schoolDetail&businessId=」鏈接?提前致謝。 – SIM

+1

按下瀏覽器中的F12->切換到「網絡」(「網絡」)選項卡 - >切換到「XHR」選項卡 - >點擊所需鏈接...您將看到發送新的請求。點擊新的請求條目 - >檢查「標題」 - >「RequestURL」 – Andersson

1

如果你看看getDetail()在源代碼中的實現方式,並探究「網絡單擊每個搜索結果鏈接時,您可能會看到爲結果發佈了多個XHR請求,並且執行了一些客戶端邏輯以形成搜索結果頁面。

如果你不想潛入複製所有的邏輯發生在形成每個搜索結果頁的 - 簡單地來回走了搜索結果頁面和一個搜索結果頁面之間:

from selenium import webdriver 

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


driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get("https://www.aopa.org/learntofly/school/") 
driver.find_element_by_id('searchTerm').send_keys('All') 
driver.find_element_by_id('btnSearch').click() 

# wait for search results to be visible 
table = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#searchResults table"))) 

for index in range(len(table.find_elements_by_css_selector('td a[href*=getDetail]'))): 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#searchResults table"))) 

    # get the next link 
    link = table.find_elements_by_css_selector('td a[href*=getDetail]')[index] 
    link_text = link.text 
    link.click() 

    print(link_text) 
    # TODO: get details 

    # go back 
    back_link = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#schoolDetail a[href*=backToList]"))) 
    driver.execute_script("arguments[0].click();", back_link) 

driver.quit() 

請注意使用Explicit Waits而不是硬編碼的「睡眠」。


它實際上可能是有意義的避免使用硒這裏完全和解決這個問題「headlessly」 - 做HTTP請求(通過requests模塊),該網站的API。

+0

感謝sir alecxe,爲您的完美解決方案。 – SIM

相關問題