2

私は遅い読み込みWebページから名前を削るスクリプトをPythonで書いています。そのページには1000の名前があり、ブラウザが一番下にスクロールするときにのみフルコンテンツを読み込むことができます。しかし、私のスクリプトはこのページの最下位部分に到達し、すべての名前を解析できます。私がここで直面している問題は、ハードコードされた遅延をこの例では5秒間使用し、アイテムがロードされてもブラウザーが不必要に待機することです。だから私はどのように明示的にこの状況を克服し、すべての項目を解析するのを待つ使用することができます。私のスクリプトで明示的にwaitを適用できません

from selenium import webdriver 
import time 

driver = webdriver.Chrome() 
driver.get("http://fortune.com/fortune500/list/") 

check_height = driver.execute_script("return document.body.scrollHeight;") 
while True: 
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    time.sleep(5) 
    height = driver.execute_script("return document.body.scrollHeight;") 
    if height == check_height: 
     break 
    check_height = height 

    listElements = driver.find_elements_by_css_selector(".company-title") 

for item in listElements: 
    print(item.text) 

答えて

1

あなたが追加することができます。ここ

は、私がこれまでに書いたスクリプトです明示的に待機する:

from selenium.webdriver.support.ui import WebDriverWait 
from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get("http://fortune.com/fortune500/list/") 

check_height = driver.execute_script("return document.body.scrollHeight;") 
while True: 
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    try: 
     WebDriverWait(driver, 10).until(lambda driver: driver.execute_script("return document.body.scrollHeight;") > check_height) 
     check_height = driver.execute_script("return document.body.scrollHeight;") 
    except: 
     break 


listElements = driver.find_elements_by_css_selector(".company-title") 
for item in listElements: 
    print(item.text) 

これは、あなたがtime.sleep()をハードコーディングを避けるためにできるようにすべきである - 代わりにあなただけのheight値を変更するのを待っているか、10秒のスクロール経過後の場合heightのループが一定で壊れている...

+0

セレンの解決策をPythonバインディングで提供するには、Andersson卿が誰にも勝るものではありません。あなたはちょうど素晴らしいです。 Thanksssssssssたくさん。 – SIM

0

を明示的な待機を使用する必要があり、このように:

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 

driver = webdriver.Firefox() 
driver.get("http://somedomain/url_that_delays_loading") 
try: 
    element = WebDriverWait(driver, 10).until(
     EC.presence_of_element_located((By.ID, "myDynamicElement")) 
    ) 
finally: 
    driver.quit() 

詳細ここhttp://selenium-python.readthedocs.io/waits.html

+0

OPであるとは思えません'ExplicitWait'実装の基本を探していますが、具体的な解決方法はありません。 – Andersson

関連する問題