2016-12-26 58 views
1

我想湊帶班錨鏈接=「_ 1UoZlX」從這個特定頁面的搜索結果 - https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4io刮元素反應JS與BeautifulSoup

當我創建頁面上的一湯,我意識到,搜索結果正在使用React JS呈現,因此我無法在頁面源代碼中找到它們(或在湯中)。

這裏是我的代碼

import requests 
from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


listUrls = ['https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4iof'] 
PHANTOMJS_PATH = './phantomjs' 
browser = webdriver.PhantomJS(PHANTOMJS_PATH) 
urls=[] 

for url in listUrls: 
    browser.get(url) 
    wait = WebDriverWait(browser, 20) 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX"))) 
    soup = BeautifulSoup(browser.page_source,"html.parser") 
    results = soup.findAll('a',{'class':"_1UoZlX"}) 
    for result in results: 
     link = result["href"] 
     print link 
     urls.append(link) 
    print urls 

這是我得到的錯誤。

Traceback (most recent call last): 
    File "fetch_urls.py", line 19, in <module> 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX"))) 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 
Screenshot: available via screen 

有人在this answer提到,有使用硒來處理網頁上的JavaScript的方式。有人可以詳細說明嗎?我做了一些谷歌搜索,但無法找到適用於這種特殊情況的方法。

回答

0

您的代碼沒有問題,但是您正在抓取的網站 - 由於某些原因無法停止加載,這會阻止頁面的解析以及您編寫的後續代碼。

我與維基百科試圖確認相同:

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

listUrls = ["https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"] 
# browser = webdriver.PhantomJS('/usr/local/bin/phantomjs') 
browser = webdriver.Chrome("./chromedriver") 
urls=[] 

for url in listUrls: 
    browser.get(url) 
    soup = BeautifulSoup(browser.page_source,"html.parser") 
    results = soup.findAll('a',{'class':"mw-redirect"}) 
    for result in results: 
     link = result["href"] 
     urls.append(link) 
    print urls 

輸出:

[u'/wiki/List_of_states_and_territories_of_India_by_area', u'/wiki/List_of_Indian_states_by_GDP_per_capita', u'/wiki/Constitutional_republic', u'/wiki/States_and_territories_of_India', u'/wiki/National_Capital_Territory_of_Delhi', u'/wiki/States_Reorganisation_Act', u'/wiki/High_Courts_of_India', u'/wiki/Delhi_NCT', u'/wiki/Bengaluru', u'/wiki/Madras', u'/wiki/Andhra_Pradesh_Capital_City', u'/wiki/States_and_territories_of_India', u'/wiki/Jammu_(city)'] 

附:爲了調試目的,我使用chrome驅動程序來針對真正的chrome瀏覽器運行腳本。從https://chromedriver.storage.googleapis.com/index.html?path=2.27/下載鉻驅動程序

0

Selenium將呈現包含Javascript的頁面。你的代碼工作正常。它正在等待生成元素。在你的情況下,Selenium沒有得到那個CSS元素。您提供的網址不是呈現結果頁面。取而代之的是,它正在生成以下錯誤頁面。

http://imgur.com/a/YwFyE

該頁面不具有CSS類。你的代碼正在等待那個特定的CSS元素。試試Firefox網絡驅動程序,看看發生了什麼。

+0

我正在使用無頭瀏覽器。可能是這個原因。將嘗試與常規瀏覽器。 – dontpanic

+0

無頭瀏覽器應該可以正常工作。普通瀏覽器將很容易看到輸出。問題修復後,您可以切換到常規瀏覽器。 Flipkart在大多數時間打開錯誤頁面。您應該讓腳本在發生時單擊「重試」按鈕。 – Sriraman