首页 > 解决方案 > 无法使用多个下拉列表中的选项使用 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)    

标签: pythonselenium-webdriverweb-scrapingbeautifulsoup

解决方案


如果你想要的只是这个过滤器:

集团 - 合作银行,期间 - 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。

而不是


推荐阅读