python - 无法使用多个下拉列表中的选项使用 python selenium 抓取动态响应表
问题描述
我想抓取网站( https://www.moneycontrol.com/fixed-income/bank_fd_main.php#data)上列出的表格的内容,其中包含Group - Cooperative Banks,Period - 2 < 3 yrs 和税务状况 - 全部并将其加载到 pandas 数据框中。尽管很努力,但我无法执行带有这 3 个要求的脚本。
我无法理解是否有办法通过find_elements_by_xpath()或任何其他类似函数传递所有这些参数。我还尝试使用WebDriverWait()以留出一些时间来加载页面的所有内容,但是尽管这样做,执行程序还是返回了NULLValueError - 因此无法找到所需的元素。
请帮我抓取动态表以及上述 3 个要求。提前致谢!!!请找到我附加的代码。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(executable_path="/Users/sidrocks/.wdm/drivers/chromedriver/mac64/90.0.4430.24/chromedriver")
driver.get("https://www.moneycontrol.com/fixed-income/bank_fd_main.php#data")
driver.find_elements_by_xpath("//select[@name='sel_banktype']/option[@value='Cooperative Banks']")[0].click()
driver.find_elements_by_xpath("//select[@id='sel_period']/option[@value='2 < 3 yrs']")[0].click()
driver.find_elements_by_xpath('//select[@name="tax_status"]/option[@value="All"]')[0].click()
driver.find_elements_by_class_name('MT10')[0].click()
try:
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "PA3 brd whbg")))
except TimeoutException:
pass
soup = bsp(driver.page_source, 'lxml')
driver.quit()
data = list()
table_data = soup.find("div", attrs={"class": "PA3 MT10 brd whbg"}).find("table")
# To extract individual row elements from the html page
for j in table_data.findAll('tr'):
row_data = j.findAll('td')
row = [tr.text.strip() for tr in row_data]
data.append(row)
head = data[1]
data = data[3:]
table = pd.DataFrame(data, columns=head)
print(table)
解决方案
如果你想要的只是这个过滤器:
集团 - 合作银行,期间 - 2 < 3 年和税务状况 - 全部
那么你真的不需要重炮selenium
。实际上,这可以用纯requests
和来完成pandas
。
就是这样:
import pandas as pd
import requests
from tabulate import tabulate
endpoint = "https://www.moneycontrol.com/fixed-income/bank_fd_main.php"
query = {
"post_flag": True,
"call_type": "best",
"sel_banktype": "Cooperative Banks",
"sel_int": 1,
"sel_period": 8,
"sel_amt": 1,
"sel_cat": "G",
"tax_status": "",
"x": 22,
"y": 14,
}
page = requests.post(endpoint, data=query).text
df = pd.read_html(page, flavor="bs4", skiprows=[0, 2])[-1]
print(tabulate(df, showindex=False))
输出:
------------------------- ----------------- -------------- ---------------------------- ------------------ ------------- ---------- ---------
INSTITUTION GROUP INTEREST % p.a period INVESTMENT (Rs) Investor Type tax status nan
Bandhan Co-operative Bank Cooperative Banks 6.15 2 years to less than 3 years Less than Rs. 2 cr General Taxable Calculate
------------------------- ----------------- -------------- ---------------------------- ------------------ ------------- ---------- ---------
df
如果您愿意,您可以轻松地转储.csv
文件。
PS。
是刮 而不是 废。
推荐阅读
- mongodb - MongoDB:按年汇总结果
- pdf - Chrome 查看器 pdf 按钮不适用于 jsPDF
- angular5 - 如何测试注入另一个服务的角度服务
- python - 导出到txt 哪些子文件夹是空的?
- javascript - 将 JSON 接口转换为数组
- javascript - 由于调整 svg 元素的大小,鼠标事件不匹配
- multithreading - 硬件多线程和同时多线程 (SMT)
- ruby-on-rails - Capistrano 部署的 Sprockets 语法错误
- java - 尝试从 Java(IntelliJ)运行 R 时无法加载 jri.dll
- tensorflow - tf.nn.conv2d_transpose 和 slim.conv2d_transpose 的区别