Selenium python webscrape falla después de la primera iteración

Im iteración a través de Tripadvisor para guardar comentarios (no traducidos, originales) y comentarios traducidos (de portugués a inglés). Así que el raspador primero selecciona los comentarios portugueses que se mostrarán, luego, como de costumbre, los convierte en inglés uno por uno y guarda los comentarios traducidos en com_, mientras que los comentarios expandidos no traducidos en expandidos_comentarios.

El código funciona bien con la primera página, pero a partir de la segunda página no guarda los comentarios traducidos. Curiosamente, solo traduce el primer comentario de cada una de las páginas y ni siquiera los guarda.

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_=[] expanded_comments=[] date_=[] driver = webdriver.Chrome("C:\Users\shalini\Downloads\chromedriver_win32\chromedriver.exe") driver.maximize_window() from bs4 import BeautifulSoup 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 "err2" try: driver.find_element_by_class_name("moreLink").click() except: print "err3" def save_comments(driver): expand_reviews(driver) # SELECTING ALL EXPANDED COMMENTS #xpanded_com_elements=driver.find_elements_by_class_name("entry") time.sleep(3) #or i in expanded_com_elements: # expanded_comments.append(i.text) spi=driver.page_source sp=BeautifulSoup(spi) for t in sp.findAll("div",{"class":"entry"}): if not t.findAll("p",{"class":"partial_entry"}): #print t expanded_comments.append(t.getText()) # Saving review date for d in sp.findAll("span",{"class":"recommend-titleInline"}) : date=d.text date_.append(date_) # 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) #com=driver.find_element_by_class_name("ui_overlay").text com= driver.find_element_by_xpath(".//span[@class = 'ui_overlay ui_modal ']//div[@class='entry']") com_.append(com.text) time.sleep(5) driver.find_element_by_class_name("ui_close_x").click().perform() time.sleep(5) except Exception as e: pass # ITERATING THROIGH ALL 200 tripadvisor webpages and saving comments & translated comments for i in range(200): 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) 

Hay 3 problemas en tu código

  1. Dentro del método save_comments() , en el driver.find_element_by_class_name("ui_close_x").click().perform() , el método click() de un webelement no es ActionChain, por lo que no puede llamar a perform() . Por lo tanto, esa línea debe ser así:
 driver.find_element_by_class_name("ui_close_x").click() 
  1. Dentro del método save_comments() , en com= driver.find_element_by_xpath(".//span[@class = 'ui_overlay ui_modal ']//div[@class='entry']") , encuentra el elemento cuando no está ‘ t aparece aún. Así que hay que agregar espera antes de esta línea. Tu código debería ser así:
 wait = WebDriverWait(driver, 10) wait.until(EC.element_to_be_clickable((By.XPATH, ".//span[@class = 'ui_overlay ui_modal ']//div[@class='entry']"))) com= driver.find_element_by_xpath(".//span[@class = 'ui_overlay ui_modal ']//div[@class='entry']") 
  1. Hay 2 botones que pueden abrir la revisión, se muestra uno y otro está oculto. Así que tienes que saltarte el botón oculto.
 if not i.is_displayed(): continue driver.execute_script("arguments[0].click()",i)