Python selenium从表中提取数据并单击

问题描述 投票:-2回答:2

亲爱的stackoverflow社区,

我最近在尝试从以下位置提取数据时遇到了麻烦:

https://www2.sgx.com/securities/corporate-information?country=SINGAPORE

我的目的是单击表格中的每个链接,从3CNERGY LIMITED开始,打开另一个网页选项卡,解压缩,解压后关闭该选项卡,返回主页面,然后单击下一个链接。

我的问题是:无法找到让我通过表循环的元素,无法从主网页切换到选项卡然后返回。

我的进步:我想

<sgx-table-list data-rendered-rows="20" data-visible-rows="10" style="min-width: 560px; transform: translateY(0px);" data-rendered-index="0" data-visible-index="0" xpath="1">

允许我循环通过表但len只返回1 ..

我已经能够点击第一个网页使用:

CE = driver.find_element_by_xpath("//a[contains(@href, 'infopub')]")

但是无法通过表循环,脚本只执行第一次单击。此外,我无法通过xpath更改它以查找元素,因为它变为列表而.click()不起作用。

任何帮助将不胜感激。谢谢!!

python selenium web click web-crawler
2个回答
0
投票

继续尝试下面的内容。我使用了XPath Helper Wizard,它是铬的插件。

链接的主表:(将sgx-table-row [RowNumberHere]更改为循环通过第1列中的公司)

driver.find_element_by_xpath("//sgx-table-row[1]/sgx-table-cell-link[contains(@class, 'sgx-table-cell')]").click()

在公司内部链接链接:(将/ tr [RowNumberHere]更改为您的变量以进行循环)

driver.find_element_by_xpath("//table[3]/tbody/tr[1]/td[contains(@class, 'basicInfoContentContainerRight')]")

回到页面:

driver.back()

0
投票

这应该非常简单。流程应该是这样的:

  1. 导航到该页面
  2. 关闭弹出对话框
  3. 等待加载数据
  4. 循环浏览公司链接,单击每个链接,从新选项卡获取数据,关闭新选项卡,切换回主窗口

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

url = "https://www2.sgx.com/securities/corporate-information?country=SINGAPORE"
driver.get(url)

wait = WebDriverWait(driver, 10)

# close the preview warning dialog
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#beta-warning-dialog button"))).click()

# wait for the data to be loaded
company_name_locator = (By.CSS_SELECTOR, "div.table-container a")
wait.until(EC.visibility_of_element_located(companyNameLocator))

main_window_handle = driver.current_window_handle
# loop through visible company links
links = list(filter(lambda e: e.is_displayed(), driver.find_elements(companyNameLocator)))
for link in links
    link.click()

    # wait for new tab to open
    wait.until(lambda d: len(d.window_handles) == 2)
    driver.switch_to_window(driver.window_handles[1])

    # scrape something off the page
    print(wait.until(EC.visibility_of_element_located(By.ID, "ctl07_lblCompName")).text)

    # close the current tab
    driver.close()

    # wait for the tab to be closed and switch back to the main tab
    wait.until(lambda d: len(d.window_handles) == 1)
    driver.switch_to_window(main_window_handle)
© www.soinside.com 2019 - 2024. All rights reserved.