2017-10-16 71 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