Reputation: 5
I'm trying to webscrape this site: https://www2.tse.or.jp/tseHpFront/JJK020010Action.do
Using the Selenium package, with Google Chrome as my browser, I'm able to open it up, choose some settings, and then run a search. I'm encountering an error because there are 21 pages of information, and I need to gather all of it, however with my code I am unable to find the link that clicks to the next page. This is what that next button's code is:
<div class="next_e">
<a href="javascript:setPage(2);submitPage(document.JJK020030Form, document.JJK020030Form.Transition);">
<img src="/common/images/spacer.gif" width="77" height="24" alt="Next">
</a>
</div>
Note -- the number in the brackets after 'setPage' corresponds to the next page number. So if I'm on page 1 the code would read setPage(2), etc.
Here is my complete code for the webscrape:
driver.get("https://www2.tse.or.jp/tseHpFront/JJK020030Action.do")
sleep(20)
data = []
button = driver.find_element_by_name("dspSsuPd")
#driver.find_elements_by_class_name
button200 = Select(button)
button200.select_by_value('200')
sleep(10)
checkboxes = ['001', '002', '004', '006', '008', '101', '102', '104', 'ETF', 'ETN', 'RET', 'PSC', '999']
for box in checkboxes:
driver.find_element_by_xpath(f"//input[@value='{box}']").click()
search_button = "//*[@class='activeButton' and @value='Start of search']"
driver.find_element(By.XPATH, search_button).click()
sleep(20)
soup1 = BeautifulSoup(driver.page_source, 'lxml')
tables1 = soup.find_all('table')
df = pd.read_html(driver.page_source)[-1]
data.append(df)
for i in range(2, 21):
## right here is where I'm encountering my issue ##
next_href = f"//*[@class='next_e' and @href ='javascript:setPage({i});submitPage(document.JJK020030Form, document.JJK020030Form.Transition);']"
driver.find_element(By.XPATH, next_href).click()
sleep(10)
soup = BeautifulSoup(driver.page_source, 'lxml')
tables = soup.find_all('table')
df1 = pd.read_html(driver.page_source)[-1]
data.append(df1)
driver.quit()
df_data = pd.DataFrame(pd.concat(data)).reset_index(drop=True)
print(df_data)
df_data.to_csv('companies_data_borse_frankfurt.csv', index=False)
The other options I have tried to click this href (all of which haven't worked), include:
driver.find_element(By.XPATH, "//div[@class='next_e']/a[contains(., 'setPage')]").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='next_e']/a[contains(., 'setPage')]"))).click()
driver.find_element_by_xpath(f'//input[@href="javascript:setPage({i});submitPage(document.JJK020030Form, document.JJK020030Form.Transition);"]').click()
driver.find_element_by_partial_link_text(f'javascript:setPage({i})')
Please let me know if you have a solution or need further clarification on the issue. Thank you!
Upvotes: 0
Views: 55
Reputation: 9969
wait=WebDriverWait(driver,60)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div.next_e>a"))).click()
Using this work just fine for going through the pages.
Import:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Upvotes: 1