2017-02-22 67 views
2

Я пытаюсь отменить обзоры с сайта verizon, и я нашел xpath отзывов, сделав inspect на веб-странице. Я выполняю код ниже, но этот review.text не работает отлично все время. Я получаю правильный текст иногда, а иногда он просто печатает Error in сообщения -Selenium web scraping in python can not read .text of elements

Не уверен, что я делаю неправильно ..

from selenium import webdriver 

url = 'https://www.verizonwireless.com/smartphones/samsung-galaxy-s7/' 
browser = webdriver.Chrome(executable_path='/Users/userName/PycharmProjects/Verizon/chromedriver') 
browser.get(url) 
reviews = [] 
xp = '//*[@id="BVRRContainer"]/div/div/div/div/div[3]/div/ul/li[2]/a/span[2]' 

# read first ten pages of reviews ==> 
for j in range(10): 
    reviews.extend(browser.find_elements_by_xpath('//*[@id="BVRRContainer"]/div/div/div/div/ol/li[*]/div/div[1]' 
                '/div/div[2]/div/div/div[1]/p')) 
    try: 
     next = browser.find_element_by_xpath(xp) 
     next.click() 
    except: 
     print(j,"error clicking") 

# Print reviews ===> 
for i, review in enumerate(reviews): 
    try: 
     print(review.text) 
    except: 
     print("Error in :" review) 

ответ

2

Вы должны улучшить логику вашего кода. Обратите внимание, что вы не можете получить текст элементов с первой страницы после перенаправления на следующую страницу - вам нужно получить текст перед нажатием кнопки «Далее».

Попробуйте использовать ниже код вместо:

from selenium import webdriver 
from selenium.common.exceptions import WebDriverException 
import time 

url = 'https://www.verizonwireless.com/smartphones/samsung-galaxy-s7/' 
browser = webdriver.Chrome() 
browser.get(url) 
reviews = [] 
xp = '//a[span[@class="bv-content-btn-pages-next"]]' 

# read first ten pages of reviews ==> 
for i in range(10): 
    for review in browser.find_elements_by_xpath('//div[@class="bv-content-summary-body-text"]/p'): 
     reviews.append(review.text) 
    try: 
     next = browser.find_element_by_xpath(xp) 
     next.location_once_scrolled_into_view 
     time.sleep(0.5) # To wait until scrolled down to "Next" button 
     next.click() 
     time.sleep(2) # To wait for page "autoscrolling" to first review + until modal window dissapeared 
    except WebDriverException: 
     print("error clicking") 


for review in reviews: 
    print(review) 
+0

Спасибо так много! Я попытался использовать 'WebDriverWait (браузер, timeout = 10) .until (EC.presence_of_element_located ((By.XPATH, '// * [@ id =" BVRRContainer "]')))' , но я думаю, что мой размещение этой логики было неправильным вообще. – Pushkr

+0

Обычно использование 'ExplicitWait' - хорошая идея. Вы можете попытаться реализовать его, чтобы заменить эти 'time.sleep()' и сэкономить некоторое время – Andersson

+0

Конечно, я очень новичок в селене. Я обязательно посмотрю на ExplicitWait. – Pushkr