2017-04-07 13 views
0

以下のコードはうまくいきますが、複数のループを使用しています。すべてのデータを取得するループを1つ作成することは可能です。pythonセレンを使用して単一ループで複数の要素を反復する方法

複数のループコード:

for post in driver.find_elements_by_class_name("_1UoZlX"): 
    mobile_link += [ post.get_attribute("href") ] 

for post1 in driver.find_elements_by_class_name("_3wU53n"): 
    mobile_name += [ post1.text ] 

for post2 in driver.find_elements_by_css_selector("._1vC4OE._2rQ-NK"): 
    offer_price += [ post2.text ] 

全コード:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.common.by import By 
import time 
import csv 
chrome_path = r"C:\Users\Venkatesh\AppData\Local\Programs\Python\Python35\chromedriver.exe" 
driver = webdriver.Chrome(chrome_path) 
RegionIDArray = ["https://www.flipkart.com/mobiles/pr?otracker=categorytree&page=1&sid=tyy%2C4io", "https://www.flipkart.com/mobiles/pr?otracker=categorytree&page=2&sid=tyy%2C4io"] 
mobile_link = [] 
mobile_name = [] 
offer_price = [] 
actual_price = [] 
data_list=[] 
delay = 10 # seconds 

for reg in RegionIDArray: 
    try: 
     driver.get(reg) 
     WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, "//*[@id='container']/div/div[2]/div[2]/div/div[2]/div/div[3]/div[1]/div/div[1]"))) 
     driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
     print("Page is ready") 

     for post in driver.find_elements_by_class_name("_1UoZlX"): 
      mobile_link += [ post.get_attribute("href") ] 

     for post1 in driver.find_elements_by_class_name("_3wU53n"): 
      mobile_name += [ post1.text ] 

     for post2 in driver.find_elements_by_css_selector("._1vC4OE._2rQ-NK"): 
      offer_price += [ post2.text ] 

     time.sleep(10)  
    except TimeoutException: 
     print("Loading took too much time") 
driver.quit() 

答えて

0

それはまだ複数のループですが、それはリストの内包表記と少しすっきりです:

mobile_link += [ post.get_attribute("href") for post in driver.find_elements_by_class_name("_1UoZlX") ] 
mobile_name += [ post1.text for post1 in driver.find_elements_by_class_name("_3wU53n") ] 
offer_price += [ post2.text for post2 in driver.find_elements_by_css_selector("._1vC4OE._2rQ-NK") ] 

単一のループが必要な理由は何ですか?彼らは無関係な要素のようです。

+0

これらのウェブサイトが表示されている場合https://www.flipkart.com/mobiles/pr?otracker=categorytree&page=1&sid=tyy%2C4io&affid=businessp2私はストライキ価格の値を取得したい(テキスト装飾:ラインスルー;)いくつかの時間価値がそこに存在しないいくつかの時間価値になります。私はすべての情報をmobile_link、mobile_nameなどのような配列に入れています。ストライク値を取得しようとすると、範囲外の問題のインデックスが渡されます。ここに質問がありますhttp://stackoverflow.com/questions/43253910/list-index-out-of-range-using-python-selenium?noredirect=1#comment73582762_43253910 –

関連する問題