阅读及;使用Python与HTML表交互

阅读及;使用Python与HTML表交互,python,html,pandas,beautifulsoup,Python,Html,Pandas,Beautifulsoup,我试图从一个HTML表格中获取信息,该表格具有在不同时间段进行筛选的交互能力。示例表位于以下URL: 我希望在9:30开始,然后向前跳1分钟与表交互。我希望将所有数据导出到数据帧。 我试过使用pandas.read_html(),也试过使用BeautifulSoup。虽然我对BeautifulSoup缺乏经验,但这两种方法都不适合我。我的请求是否可行,或者网站是否保护这些信息不被网络抓取?任何帮助都将不胜感激 此页面由JavaScript呈现,如果在浏览器中禁用JS,则此页面的输出为: 请求或

我试图从一个HTML表格中获取信息,该表格具有在不同时间段进行筛选的交互能力。示例表位于以下URL:

我希望在9:30开始,然后向前跳1分钟与表交互。我希望将所有数据导出到数据帧。
我试过使用pandas.read_html(),也试过使用BeautifulSoup。虽然我对BeautifulSoup缺乏经验,但这两种方法都不适合我。我的请求是否可行,或者网站是否保护这些信息不被网络抓取?任何帮助都将不胜感激

此页面由JavaScript呈现,如果在浏览器中禁用JS,则此页面的输出为:

请求或熊猫只处理HTML代码。

页面非常动态(而且速度非常慢,至少在我这方面),涉及JavaScript和多个异步请求来获取数据。使用
请求
实现这一点并不容易,您可能需要使用浏览器自动化,例如通过
selenium

这里有一些东西让你开始。注意这里和那里的用法:

import pandas as pd
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Firefox()
driver.maximize_window()
driver.get("http://quotes.freerealtime.com/dl/frt/M?IM=quotes&type=Time%26Sales&SA=quotes&symbol=IBM&qm_page=45750")

wait = WebDriverWait(driver, 400)  # 400 seconds timeout

# wait for select element to be visible
time_select = Select(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "select[name=time]"))))

# select 9:30 and go
time_select.select_by_visible_text("09:30")
driver.execute_script("arguments[0].click();", driver.find_element_by_id("go"))
time.sleep(2)

while True:
    # wait for the table to appear and load to pandas dataframe
    table = wait.until(EC.presence_of_element_located((By.ID, "qmmt-time-and-sales-data-table")))
    df = pd.read_html(table.get_attribute("outerHTML"))
    print(df[0])

    # wait for offset select to be visible and forward it 1 min
    offset_select = Select(wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "select[name=timeOffset]"))))
    offset_select.select_by_value("1")

    time.sleep(2)

    # TODO: think of a break condition

请注意,这在我的机器上运行得非常非常慢,我不确定它在你的机器上运行得如何,但它在一个无休止的循环中不断向前推进1分钟(你可能需要在某个时候停止它)。

所以我不能访问信息,因为它是用JavaScript呈现的吗?@Evy555 yes,如果您想与浏览器交互,请使用selenium。您对特定于selenium的方法感兴趣吗?是的,当然!非常感谢。运行此操作时出现错误。消息:“geckodriver”可执行文件需要在PATH@Evy555是的,那是个好主意。