首先,您应该在尝试查找元素之前调用一次implicitly_wait。
问题似乎是您需要为您的请求传递一个User-Agent 标头。实际返回的文本是纯 JavaScript,最终会加载页面内容(我已经打印出来了),所以调用 get_text 的返回值表单只是空行:
from urllib.request import urlopen, Request
from selenium import webdriver
from selenium.webdriver.common.by import By
url = "https://otctransparency.finra.org/otctransparency/OtcDownload"
chrome_path = "C:\\Users\\derpe\\Downloads\\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.implicitly_wait(5)
driver.get(url)
#bypass user agreement
agree = driver.find_elements_by_xpath("//button[@class='btn btn-warning']")[0]
agree.click()
#open non-ats page
nonats = driver.find_element_by_link_text('OTC (Non-ATS) Download')
nonats.click()
#open download page
downloadats = driver.find_element_by_xpath("//img[@src='./assets/icon_download.png']")
downloadats.click();
#bs get text with url
url = 'https://otctransparency.finra.org/otctransparency/assets/download.html'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = Request(url, headers=headers)
resp = urlopen(req)
html = resp.read().decode('utf-8')
soup = BeautifulSoup(html)
print(soup.get_text())
print(html)
driver.quit()
打印:
<html>
<head>
<title></title>
<meta name="google" content="notranslate" />
<script>
var welcomeMessage = 'Please wait';
window.onload = function()
{
if (!window.opener)
{
document.body.innerHTML = 'No data found';
}
else if (window.opener.downloadCache)
{
document.body.innerHTML = window.opener.downloadCache;
}
else
{
document.body.innerHTML = welcomeMessage;
console.log(document.body.innerHTML.substr(0, welcomeMessage.length));
loading();
}
}
function loading()
{
if (document.body.innerHTML.substr(0, welcomeMessage.length) == welcomeMessage)
{
document.body.innerHTML += '.';
setTimeout(loading, 500);
}
}
</script>
</head>
<body></body>
</html>
所以你应该尝试使用 selenium 加载最终页面:
from selenium import webdriver
from selenium.webdriver.common.by import By
url = "https://otctransparency.finra.org/otctransparency/OtcDownload"
chrome_path = "C:\\Users\\derpe\\Downloads\\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.implicitly_wait(5)
driver.get(url)
#bypass user agreement
agree = driver.find_elements_by_xpath("//button[@class='btn btn-warning']")[0]
agree.click()
#open non-ats page
nonats = driver.find_element_by_link_text('OTC (Non-ATS) Download')
nonats.click()
#open download page
downloadats = driver.find_element_by_xpath("//img[@src='./assets/icon_download.png']")
downloadats.click();
#bs get text with url
url = 'https://otctransparency.finra.org/otctransparency/assets/download.html'
driver.get(url)
soup = BeautifulSoup(driver.page_source)
print(soup.get_text())
driver.quit()
打印:
没有找到数据
评论
如果您查看源代码的第一个版本中返回的 JavaScript,您会看到:
if (!window.opener)
{
document.body.innerHTML = 'No data found';
}
见Window.opener。如果您只是像在第二个源代码中那样使用driver.get 加载页面“https://otctransparency.finra.org/otctransparency/assets/download.html”,window.opener 将是null,这就是为什么你看No data found。您似乎应该通过单击您已加载的上一页上的链接来访问此页面。