2016-10-11 5 views
1

Ich versuche, Benutzerkommentare von Tripadvisor zu übersetzen.
Mein Code: -Selen kann nicht auf Elemente iterieren

1.] Wählt portugisische Kommentare (von Sprache Dropdown),

2.] erweitert Dann wird jedes der Kommentare,

3.] speichert dann alle diese erweiterten Kommentare in einer Liste

4.] übersetzt Dann sie in Englisch & druckt auf dem Bildschirm

from selenium import webdriver 
from selenium.webdriver.common.by import By 
import time 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
com_=[] # To save translated comments 
expanded_comments=[] # To save expanded comments 
driver = webdriver.Chrome("C:\Users\shalini\Downloads\chromedriver_win32\chromedriver.exe") 
driver.maximize_window() 

def expand_reviews(driver): 
    # TRYING TO EXPAND REVIEWS (& CLOSE A POPUP)  
    try: 
     driver.find_element_by_class_name("moreLink").click() 
    except: 
     print "err" 
    try: 
     driver.find_element_by_class_name("ui_close_x").click() 
    except: 
     print "err" 
    try: 
     driver.find_element_by_class_name("moreLink").click() 
    except: 
     print "err3" 




def save_comments(driver): 
    expand_reviews(driver) 
    # SELECTING ALL EXPANDED COMMENTS 
    expanded_com_elements=driver.find_elements_by_class_name("entry") 
    time.sleep(3) 
    for i in expanded_com_elements: 
     expanded_comments.append(i.text) 


    # SELECTING ALL GOOGLE-TRANSLATOR links 
    gt= driver.find_elements(By.CSS_SELECTOR,".googleTranslation>.link") 

    # NOW PRINTING TRANSLATED COMMENTS 
    for i in gt: 
     try: 
      driver.execute_script("arguments[0].click()",i) 
      #i.click().perform() 
      com=driver.find_element_by_class_name("ui_overlay").text 
      com_.append(com) 
      time.sleep(5) 
      driver.find_element_by_class_name("ui_close_x").click().perform() 
      time.sleep(5) 
     except Exception as e: 
      pass 
      #print e 



for i in range(282): 
    page=i*10 
    url="https://www.tripadvisor.com/Airline_Review-d8729164-Reviews-Cheap-Flights-or"+str(page)+"-TAP-Portugal#REVIEWS" 
    driver.get(url) 
    wait = WebDriverWait(driver, 10) 
    if i==0: 
     # SELECTING PORTUGUESE COMMENTS ONLY # Run for one time then iterate over pages 
     try: 
      langselction = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.sprite-date_picker-triangle"))) 
      langselction.click() 
      driver.find_element_by_xpath("//div[@class='languageList']//li[normalize-space(.)='Portuguese first']").click() 
      time.sleep(5) 
     except Exception as e: 
      print e 

    save_comments(driver) 

================ FEHLER ================

expanded_comments gibt leere Liste zurück. Einige Kommentare werden gespeichert, andere werden übersprungen. Die erste Seite wird korrekt gespeichert (alle Kommentare werden erweitert), aber danach wird nur der erste Kommentar gespeichert, ohne erweitert zu werden. Aber übersetzte Kommentare von allen Seiten werden korrekt in com_

Antwort

1

Ich habe Ihren Code geändert und jetzt funktioniert es.

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

driver = webdriver.Chrome("./chromedriver.exe") 
driver.maximize_window() 
url="https://www.tripadvisor.com/Airline_Review-d8729164-Reviews-Cheap-Flights-TAP-Portugal#REVIEWS" 
driver.get(url) 
wait = WebDriverWait(driver, 10) 



# SELECTING PORTUGUESE COMMENTS ONLY 
#show_lan = driver.find_element_by_xpath("//div[@class='languageList']/ul/li[contains(text(),'Portuguese first')]") 

try: 
    langselction = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.sprite-date_picker-triangle"))) 
    langselction.click() 
    driver.find_element_by_xpath("//div[@class='languageList']//li[normalize-space(.)='Portuguese first']").click() 
    time.sleep(5) 
except Exception as e: 
    print e 


# TRYING TO EXPAND REVIEWS (& CLOSE A POPUP)  
try: 
    driver.find_element_by_class_name("moreLink").click() 
except: 
    print "err" 
try: 
    driver.find_element_by_class_name("ui_close_x").click() 
except: 
    print "err" 
try: 
    driver.find_element_by_class_name("moreLink").click() 
except: 
    print "err3" 

# SELECTING ALL EXPANDED COMMENTS 
expanded_com_elements=driver.find_elements_by_class_name("entry") 
expanded_comments=[] 
time.sleep(3) 
for i in expanded_com_elements: 
    expanded_comments.append(i.text) 

# SELECTING ALL GOOGLE-TRANSLATOR links 
gt= driver.find_elements(By.CSS_SELECTOR,".googleTranslation>.link") 

# NOW PRINTING TRANSLATED COMMENTS 
for i in gt: 
    try: 
     driver.execute_script("arguments[0].click()",i) 
     #i.click().perform() 
     print driver.find_element_by_class_name("ui_overlay").text 
     time.sleep(5) 
     driver.find_element_by_class_name("ui_close_x").click().perform() 
     time.sleep(5) 
    except Exception as e: 
     pass 
     #print e 
+0

können Sie mir bitte helfen http://stackoverflow.com/questions/40013400/selenium-python-webscrape-fails-after-first-iteration – shalini

+0

lösen ja i Sie überprüfen und aktualisieren – Piyush