2017-10-16 70 views
1

我已經在python中編寫腳本並結合selenium來解析網頁中的名稱。該網站的數據不支持JavaScript。但是,下一頁鏈接在JavaScript內。由於該網頁的下一頁鏈接對於requests庫而言沒有用處,因此我使用硒來解析來自該網站的數據,並遍歷了25個頁面。我在這裏面臨的唯一問題是,儘管我的刮板能夠通過點擊25頁到達最後一頁,但它僅從第一頁獲取數據。而且,即使點擊了最後一頁,刮刀仍然繼續運行。下一頁鏈接看起來完全像javascript:nextPage();。順便說一句,即使我點擊下一頁按鈕,該網站的網址永遠不會改變。我怎樣才能從25頁獲得所有的名字?我在刮刀中使用的CSS選擇器完美無瑕。提前致謝。刮板無法從下一頁獲取名稱

這裏是我寫的東西:

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 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false") 

while True: 
    for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))): 
     print(name.text) 

    try: 
     n_link = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href*='nextPage']"))) 
     driver.execute_script(n_link.get_attribute("href")) 
    except: break 

driver.quit() 

回答

2

您不必處理「下一步」按鈕或以某種方式更改頁碼 - 所有條目都已在頁面源代碼中。嘗試下面:

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 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false") 
for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))): 
     print(name.get_attribute('textContent')) 

driver.quit() 

您也可以嘗試這種解決方案,如果它不是強制性的,你使用Selenium:

import requests 
from lxml import html 

r = requests.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false") 
source = html.fromstring(r.content) 

for name in source.xpath("//table[@class='greygeneraltxt']//td[text() and position()>1]"): 
     print(name.text) 
+0

你打我吧......我不認爲第一位將工作因爲你不能在使用Selenium的不可見元素上使用'get_attribute()'。我打算建議他使用JSE,例如'.execute_script(「return arguments [0] .innerText」,name)'在你的情況。 – JeffC

+1

@JeffC,'text'屬性不允許獲取隱藏元素的內容。 'get_attribute('textContent')'[爲此目的正常工作](https://stackoverflow.com/questions/43429788/python-selenium-finds-h1-element-but-returns-empty-text-string/43430097# 43430097) – Andersson

+0

感謝sir Andersson提供這樣一個強大的解決方案。有一天我會想出一個難以解決的難題,因爲你已經立於不敗之地。再次感謝。 – SIM

0

看來這實際上可以比目前的方法更簡單地完成。在driver.get方法之後,您可以簡單地使用page_source屬性來獲取它後面的html。從那裏你可以一次從所有的25頁獲取數據。要查看它的結構如何,只需右鍵單擊並在Chrome中查看源代碼。

html_string=driver.page_source