我是美丽汤的新手,不确定如何从该网站为每个州(新南威尔士州、维多利亚州、昆士兰州、南澳大利亚州)添加“解决”栏:
https://www.asxenergy.com.au /futures_au
似乎没有显示数值数据。
我的起始代码是:
from bs4 import BeautifulSoup
from urllib.request import urlopen
url = "https://www.asxenergy.com.au/futures_au"
page = urlopen(url)
html = page.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
print(soup.get_text())
是对的,表格数据没有直接包含在 HTML 中。它很可能是使用 JavaScript 动态加载的。Beautiful Soup 仅解析 HTML,不会执行 JavaScript。
为了从该网站中提取数据,需要使用能够呈现 JavaScript 的工具。以下是两种流行的选择:
1. 使用 Selenium 或 Playwright 等浏览器自动化工具:
这些工具可以让控制一个真实的浏览器,例如 Chrome 或 Firefox。可以加载网站,等待 JavaScript 执行,然后使用 Beautiful Soup 解析生成的 HTML。
这是一个使用 Selenium 的示例:
```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup
url = "https://www.asxenergy.com.au/futures_au"
# 使用合适的 webdriver 路径替换下面的路径 driver = webdriver.Chrome(executable_path="/path/to/chromedriver") driver.get(url)
# 等待表格加载完成 table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "datatable_au")) )
# 获取页面源代码 html = driver.page_source
# 使用 Beautiful Soup 解析 HTML soup = BeautifulSoup(html, "html.parser")
# 提取表格数据 # ...
# 关闭浏览器 driver.quit() ```
2. 使用可以执行 JavaScript 的 HTTP 库,例如 Requests-HTML:
Requests-HTML 库提供了一种更轻量级的解决方案,无需启动完整的浏览器。它使用 Chromium 的无头模式来执行 JavaScript。
这是一个使用 Requests-HTML 的示例:
```python from requests_html import HTMLSession from bs4 import BeautifulSoup
url = "https://www.asxenergy.com.au/futures_au"
session = HTMLSession() response = session.get(url)
# 渲染 JavaScript response.html.render()
# 使用 Beautiful Soup 解析 HTML soup = BeautifulSoup(response.html.html, "html.parser")
# 提取表格数据 # ... ```
提取表格数据:
在使用上述任何一种方法加载了完整的 HTML 后,可以使用 Beautiful Soup 提取表格数据。例如,可以使用
find
方法找到表格,然后迭代行和单元格来提取数据。
# 查找表格
table = soup.find("table", id="datatable_au")
# 迭代表格行
for row in table.find_all("tr")[1:]: # 跳过标题行
cells = row.find_all("td")
state = cells[0].text.strip()
settlement = cells[1].text.strip()
print(f"State: {state}, Settlement: {settlement}")
请注意,这只是一个示例,可能需要根据实际的 HTML 结构调整代码。
标签:python,web-scraping,beautifulsoup From: 78802780