2017-10-16 16 views
1

私は、Webページの名前を解析するために、Pythonでセレントと組み合わせてスクリプトを書いています。そのサイトからのデータはJavaScriptが有効になっていません。ただし、次のページのリンクはjavascript内にあります。 requestsライブラリに行くと、そのWebページの次のページリンクは役に立たないので、25ページを横断してそのサイトのデータを解析するためにセレンを使用しました。私がここで直面している唯一の問題は、私のスクレーパーが25ページをクリックして最後のページに到達することができますが、それは最初のページからのみデータを取得することです。さらに、最後のページをクリックしたにもかかわらずスクレーパーは稼働し続けます。次のページのリンクは、javascript:nextPage();のようになります。 Btw、私は次のページボタンをクリックしても、そのサイトのURLは変更されません。どのように私は25ページからすべての名前を得ることができますか?私のスクレーパーで使用したCSSセレクターは完璧です。前もって感謝します。ここでScraperが次のページから名前を取得できません

は、私が書いたものです:

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() 

また、あなたはセレンを使用することは必須ではありません場合は、このソリューションを試してみることができます。

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("あなたのケースでは、引数を返す.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

このような堅牢なソリューションのおかげでAndersson氏。いつかあなたが無敵だったので解決するのは難しい問題を思いつきます。再度、感謝します。 – SIM

0

が、実際に現在のアプローチよりも、より簡単に行うことができます表示されます。 driver.getメソッドの後に、単にpage_sourceプロパティを使用してhtmlを取得することができます。そこから一度に全25ページのデータを取得できます。どのように構造化されているかを見るには、右クリックしてクロムの「ソースを表示」するだけです。

html_string=driver.page_source 
関連する問題