2017-02-22 4 views
2

私はverizonのウェブサイトからレビューをスクラップしようとしています。私はウェブページ上でinspectを実行してレビューのxpathを見つけました。私はコードの下で実行していますが、このreview.textは完全に常に動作しているようです。私は、正しいテキストは時々、時にはそれだけでError inメッセージ出力し得る -python can notでのセレニウムウェブの掻き取り。要素の文章

わからない、私が間違って何をやっているの。..

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(browser、timeout = 10).untilを使用しようとしましたが、私は(そのロジックの配置はすべて間違っていました.. – Pushkr

+0

通常、 'ExplicitWait'を使うのは良い考えです。あなたはそれらを 'time.sleep()'に置き換えて実装して、時間を節約しようとすることができます – Andersson

+0

確かに、私はセレンに非常に新しいです。私は間違いなくExplicitWaitを調べます。 – Pushkr