首页 > 解决方案 > 通过python中的beautifulsoup从yahoofinance中提取表数据

问题描述

我是一名 Python 程序员。我想通过beautifulsoup库提取下面链接中的所有表格数据。

这是链接:https ://finance.yahoo.com/quote/GC%3DF/history?p=GC% 3DF[在此处输入图像描述] 1

标签: pythonbeautifulsouphtml-table

解决方案


您需要查看网络抓取教程。

这是一个让您入门的方法:https ://realpython.com/python-web-scraping-practical-introduction/

这种事情可能会因复杂的标记而变得有点复杂,我会说问题帖子中提供的链接有资格作为稍微复杂的标记,但基本上,你想找到带有“Pb( 10px) Ovx(a) W(100%)” 类或表容器,其数据测试属性为“历史价格”。从那里向下钻取到您需要的标记数据。

但是,如果您坚持使用 BeautifulSoup 库,这里有一个教程:https : //realpython.com/beautiful-soup-web-scraper-python/ 向下滚动到第 3 步:“使用 Beautiful Soup 解析 HTML 代码”

安装库:python -m pip install beautifulsoup4

然后,使用以下代码抓取页面:

import requests
from bs4 import BeautifulSoup

URL = "https://finance.yahoo.com/quote/GC%3DF/history?p=GC%3DF"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")

然后,找到我之前提到的具有“历史价格”的 data-test 属性的表容器:

results = soup.find(attrs={"data-test" : "historical-prices"})

感谢其他 StackOverflow 帖子提供了有关 attrs 参数的信息:Extracting an attribute value with beautifulsoup

从那里,你会想要向下钻取。我不确定如何正确执行此步骤,因为我以前从未在 Python 中这样做过,但是有多种方法可以做到这一点。我的首选方法是在初始结果集上使用 find 方法或 findAll 方法:

result_set = results.find("tbody", recursive=False).findAll("tr")

或者,您可以使用已弃用的 findChildren 方法:

result_set = results.findChildren("tbody", recursive=False)
result_set2 = result_set.findChildren("tr", recursive=False)

您可能需要为每个向下钻取一个结果集循环。请注意,您提到的页面并不容易。您必须多次深入才能找到正确的 tr 元素。当然,上面的代码只是示例代码,没有经过适当的测试。


推荐阅读