【问题标题】:Unable to Web scrape a dynamic responsive table using python selenium using options from multiple dropdown list无法使用多个下拉列表中的选项使用 python selenium 抓取动态响应表
【发布时间】:2021-07-30 17:38:36
【问题描述】:

我想抓取网站 (https://www.moneycontrol.com/fixed-income/bank_fd_main.php#data) 上列出的表格的内容,其中包含 Group - Cooperative Banks, Period - 2 并将其加载到 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)    

【问题讨论】:

  • 仅供参考,它是 scrape(和 scraperscrapedscraping)不是废品。 “废弃”的意思是扔掉,这与你想要做的几乎相反。

标签: python selenium-webdriver web-scraping beautifulsoup


【解决方案1】:

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

集团 - 合作银行,期间 - 2

那么你真的不需要selenium 的重炮。其实这可以用纯requestspandas来完成。

方法如下:

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。

scrape 不是 scrap

【讨论】:

  • 谢谢@baduker。这确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2015-05-07
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多