我正在尝试使用selenium抓取website表中的company names, code, industry, sector, mkt cap, etc
列表。我是新手,并编写了以下代码:
path_to_chromedriver = r'C:\Documents\chromedriver'
browser = webdriver.Chrome(executable_path=path_to_chromedriver)
url = r'http://sgx.com/wps/portal/sgxweb/home/company_disclosure/stockfacts'
browser.get(url)
time.sleep(15)
output = browser.page_source
print(output)
但是,我能够获得以下标签,但不能获得其中的数据..
<div class="table-wrapper results-display">
<table>
<thead>
<tr></tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="pager results-display"></div>
我之前也曾尝试使用BS4进行刮擦,但失败了。任何帮助深表感谢。
答案 0 :(得分:2)
结果位于iframe - 切换到它然后获取.page_source
:
iframe = driver.find_element_by_css_selector("#mainContent iframe")
driver.switch_to.frame(iframe)
我还要添加等待加载的表:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
# locate and switch to the iframe
iframe = driver.find_element_by_css_selector("#mainContent iframe")
driver.switch_to.frame(iframe)
# wait for the table to load
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.companyName')))
print(driver.page_source)
答案 1 :(得分:0)
这完全可行。最简单的方法是使用&#39; find_elements&#39;打电话(注意它是复数)并抓住所有<tr>
元素。它将返回一个列表,您可以使用列表中每个元素的查找元素(单数)调用进行解析,但这次通过类查找每个元素。
您可能遇到了计时问题。我注意到你要查找的数据非常缓慢。您可能需要等待该数据。最好的方法是检查它的存在,直到它出现,然后尝试加载它。查找元素调用(再次注意,我再次使用复数)在查找元素并找不到时不会抛出异常,它只会返回一个空列表。这是检查数据显示的一种不错的方法。