首页 > 编程问答 >使用 powershell 或 python 从网页列出公司名称

使用 powershell 或 python 从网页列出公司名称

时间:2024-07-29 15:15:39浏览次数:15  
标签:python powershell selenium-webdriver web-scraping

我希望使用 PowerShell 或 python 仅列出 URL 中的公司名称:

https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29

enter image description here

下面是我的 python 脚本用于获取网页的结构:

import requests
from bs4 import BeautifulSoup

# URL of the page
url = "https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29"

# Fetch the page content
response = requests.get(url)
print(f"Status Code: {response.status_code}")

soup = BeautifulSoup(response.content, 'html.parser')

# Print the first 1000 characters of the HTML to check if we're getting content
print(soup.prettify()[:1000])

# Try different selectors
selectors = [
    'div.PA10',  # Example selector, replace with potential correct ones
    'table.mctable1',
    'td.PR10.PT5.PB5',
    # Add more potential selectors here
]

for selector in selectors:
    elements = soup.select(selector)
    print(f"\nTrying selector: {selector}")
    print(f"Found {len(elements)} elements")
    for element in elements[:5]:  # Print first 5 elements for each selector
        print(element.text.strip())

# If still no results, print all unique tag names in the HTML
print("\nAll unique tags in the HTML:")
print(set([tag.name for tag in soup.find_all()]))

输出:

PS C:\AMD> python getcompany.py
Status Code: 200
<!DOCTYPE html>
<html lang="en">
 <head>
  <link as="style" href="https://accounts.moneycontrol.com/assets/css/mclogin/bootstrap.min.css" rel="preload"/>
  <link as="style" href="https://stat2.moneycontrol.com/mccss/headfoot/mc_header.css?v=1.11" rel="preload"/>
  <meta charset="utf-8"/>
  <title>
   Results Calendar: Company Results Calendar, Quarterly Results Calendar and BSE NSE Results Calendar | Moneycontrol
  </title>
  <meta content="Results Calendar: Check quarterly results calendar of BSE NSE listed companies by the Moneycontrol. Get results announcements date of all the listed stocks and shares, stocks earnings calendar, Stocks results calendar, earnings date calendar, earnings result date, announcements, news, and more" name="description"/>
  <meta content="Results Calendar, Earnings calendar, listed company results calendar, Quarterly results calendar, Company results dates list, Company Quarterly Earnings Calendar, Company Quarterly Results Calendar, Company Quarterly Earn

我无法得出 Company Name 的列名称。但是,尝试了以下 python,它无法获取所需的公司名称列表:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import time
import random

def random_sleep(min_seconds, max_seconds):
    time.sleep(random.uniform(min_seconds, max_seconds))

# Setup Chrome options
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

# Setup the Chrome driver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

# Overwrite the navigator.webdriver property
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

# URL of the page
url = "https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-08-01"

try:
    # Load the page
    driver.get(url)
    print("Page loaded successfully")

    # Random sleep to mimic human behavior
    random_sleep(5, 10)

    # Wait for the table to be present in the DOM
    wait = WebDriverWait(driver, 30)
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, "mctable1")))

    # Get the page source
    page_source = driver.page_source

    # Parse the page source with BeautifulSoup
    soup = BeautifulSoup(page_source, 'html.parser')

    # Find the table
    table = soup.find('table', class_='mctable1')

    if table:
        # Find all rows in the table
        rows = table.find_all('tr')

        # Extract and print company names
        for row in rows[1:]:  # Skip header row
            cells = row.find_all('td')
            if len(cells) > 1:
                company_name = cells[0].text.strip()
                print(company_name)
    else:
        print("Table not found in the page source")

except Exception as e:
    print(f"An error occurred: {str(e)}")

finally:
    # Close the browser
    driver.quit()

您能否建议使用 powershell 或 python 或任何其他语言的解决方案?


当然,问题似乎出在尝试访问动态加载的内容上。也就是说,网站的初始 HTML 不包含公司名称列表,而是在页面加载后通过 JavaScript 填充。

以下是如何使用 Python 和 requests_html 库来解决此问题的方法,该库具有渲染 JavaScript 的功能:

from requests_html import HTMLSession
from bs4 import BeautifulSoup

url = "https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-08-01"

session = HTMLSession()
response = session.get(url)

# 这是关键部分:使用 JavaScript 渲染页面
response.html.render()

soup = BeautifulSoup(response.html.html, 'html.parser')

table = soup.find('table', class_='mctable1')

if table:
    rows = table.find_all('tr')
    for row in rows[1:]:
        cells = row.find_all('td')
        if len(cells) > 1:
            company_name = cells[0].text.strip()
            print(company_name)
else:
    print("在页面源代码中未找到表格")

此代码执行以下操作:

  1. 使用 requests_html 获取页面: 这与 requests 类似,但 requests_html 允许 JavaScript 渲染。
  2. 渲染页面: response.html.render() 行执行 JavaScript 并更新页面内容。
  3. 解析 HTML: 使用 BeautifulSoup 解析生成的 HTML,就像之前一样。
  4. 提取公司名称: 逻辑保持不变;从表中提取公司名称。

此方法应该可以解决该问题,并允许从动态加载的表格中检索公司名称。

如果遇到与 requests_html 或任何特定库相关的其他问题,请确保已安装它 ( pip install requests_html ) 并且的环境已正确设置。

标签:python,powershell,selenium-webdriver,web-scraping
From: 78805804

相关文章

  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • Python如何统治AI世界?一文读懂它的优势与挑战
    一、Python语言介绍1.1Python语言概述Python是一种由GuidovanRossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使用花括号或关键词的编程语言不同。Python......
  • 找到一种方法将program1的输出作为python中program2的输入发送
    有人可以帮我找到一种方法将program1的输出作为python中的program2的输入发送将其保存为.csv文件不会对我有帮助,因为该程序应该尽快执行这些任务。因此我正在寻找一种方法将程序1的终端输出直接发送到程序2在Python中,可以使用子进程模块将一个程序的输出发送到另一个程......
  • 同时运行多个Python程序的最佳方法
    我有一个python程序,我想同时运行多个具有不同参数的实例。这些实例彼此之间不进行通信。在单独的终端中运行每个实例太乏味了。我考虑使用多处理模块将每个实例作为单独的进程运行,但是我希望能够随时停止和重新启动某些单独的实例,而不会中断其他正在运行的实例。是否有任何流程......
  • 替换 Python 数据框中包含值的 <
    我有一个数据框,在某些列中存在诸如“<0.5、<10、<100”等值。如果值仅包含“<”,我想将所有这些值替换为0。我该怎么做?我对Python比较陌生。尝试使用pd.DataFrame.replace()。importpandasaspd#创建示例数据框df=pd.DataFrame({'A':['<0.5','<10',15,20],......
  • 基于funasr+pyaudio实现电脑本地麦克风实时语音识别项目语音转文本python实现
    【框架地址】https://github.com/modelscope/FunASR【简单介绍】FunASR是一个功能全面的语音识别工具包,支持多种预训练模型的推理和微调,提供高精度和高效能的语音识别服务。结合PyAudio库,可以实现电脑本地麦克风实时语音识别项目。该项目首先通过PyAudio库捕获麦克风输入的......
  • 从Python中的数据框中删除不必要的数据
    所以我这里有一个dat文件,我正在使用Python来读取它。在整个文件中,有一些不必要的行,例如BEGIN等,而我真正想开始阅读的部分是从数据帧开始。因此,我想检查在Python中执行此操作的最佳方法是什么,并且只阅读数据框何时开始?谢谢!以下是使用Python从数据......
  • Python拟合曲线
    拟合曲线多项式拟合np.ployfit(x,y,deg)importmatplotlib.pyplotaspltimportnumpyasnpx=[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8]y=[33.40,79.50,122.65,159.05,189.15,214.15,238.65,252.2,267.55,280.50,296.65,301.65,310.......
  • 12个Python数据类型转换实战演练
    文末赠免费精品编程资料~~在Python编程中,数据类型转换是处理数据时必不可少的技能。掌握如何灵活地在不同类型之间转换,能让你的代码更加高效和灵活。下面,我们将通过一系列实战演练,学习并实践12种常见的Python数据类型转换。1.整数转字符串实战案例:将年龄转换为字符串......