我想将 Tesla Quarterly Revenues 中的数据导入到 Pandas 数据框中。我一直在提取年收入表(两个表在网页上并排排列)。我需要如何修改我的代码来提取季度收入?提前致谢。
```html_data = requests.get('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue').text
soup = BeautifulSoup(html_data, 'html5lib')
tesla_revenue = pd.DataFrame(columns=['Date', 'Revenue'])
for row in soup.find("tbody").find_all("tr"):
col = row.find_all("td")
if (col != []):
date =col[0].text
revenue =col[1].text
tesla_revenue = tesla_revenue.append({"Date":date, "Revenue":revenue}, ignore_index=True)
tesla_revenue```
答案 0 :(得分:2)
要坚持您的方法,您可以使用以下 css 选择器。请注意,我跳过了作为标题的第一行
Py 请求:
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
r = requests.get('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue')
soup = bs(r.content, 'html5lib')
tesla_revenue = pd.DataFrame(
[{"Date": r.select_one('td:nth-of-type(1)').text,
"Revenue":r.select_one('td:nth-of-type(2)').text}
for r in soup.select('#style-1 div + div .historical_data_table tr')[1:]]
, columns = ['Date', 'Revenue'])
print(tesla_revenue)
此 #style-1 div + div .historical_data_table tr
选择具有 id style-1 且具有子 div 的父级,通过后代组合器 ( ),然后移动到具有相邻兄弟组合器 (+) 的相邻 div,然后是表格元素其中有类(.)history_data_table,最后,通过后代组合器(),选择所有行,tr,inside。
您可以通过按 F12 然后按 Ctrl + F 并输入 css {{1}并按回车键。然后您可以在比赛中循环。
您可以在此处阅读有关 css 选择器的信息:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors
Py 熊猫 read_html:
不过那里有很多不必要的工作。
您可以更轻松地使用pandas read_html 并索引正确的表:
#style-1 div + div .historical_data_table tr
如上所述,您可以通过在元素选项卡中搜索来找到正确的索引,但使用 css 类型选择器 import pandas as pd
table = pd.read_html('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue')[1]
print(table)
- 您将看到第二个实际的表格元素匹配是您想要的。
如果您检查页面源(右键单击查看源),您将找到表格,这意味着内容是静态的并且 read_html 可以读取它(除非请求标头)。
抓取:
根据@MichaelLongstreth 的有用评论
请阅读 https://www.macrotrends.net/robots.txt 以了解是否允许抓取。如果不允许,请寻找提供相同数据的公共 API 或其他允许抓取的网站。