【问题标题】:Issues with web-scraping: Unable to retrieve the right table (Quarterly stock price) from MacroTrends using Tesla stock price网络抓取问题:无法使用特斯拉股价从 MacroTrends 检索正确的表格(季度股价)
【发布时间】:2021-03-10 05:06:36
【问题描述】:

我想将 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```

【问题讨论】:

  • 您可以使用来自 pandas import pandas as pd;table = pd.read_html('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue')[1]soup.select_one('#style-1 div + div .historical_data_table') 的 read_html
  • 在抓取此网站之前,请务必阅读 macrotrends.net/robots.txt

标签: python pandas web-scraping beautifulsoup


【解决方案1】:

要坚持您的方法,您可以使用以下 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,然后是具有class (.)history_data_table,最后,通过后代组合器 (),选择所有行,tr,在其中。

您可以通过按 F12 然后按 Ctrl + F 并输入 css #style-1 div + div .historical_data_table tr 和点击进入。然后你可以循环比赛。

您可以在此处阅读有关 CSS 选择器的信息:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors


Py pandas read_html:

虽然那里有很多不必要的工作。

您可以更轻松地使用 pandas read_html 并为正确的表建立索引:

import pandas as pd

table = pd.read_html('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue')[1]
print(table)

如上所述,您可以通过在元素选项卡中搜索来找到正确的索引,但使用 css 类型选择器table - 您将看到第二个实际的表元素匹配是您想要的。

如果您检查页面源代码(右键单击查看源代码),您会发现该表格,这意味着内容是静态的,并且 read_html 可以读取它(除非请求标头)是必需的。


抓取:

根据@MichaelLongstreth 的有用评论

请阅读https://www.macrotrends.net/robots.txt 了解是否允许抓取。如果不允许,请寻找提供相同数据的公共 API 或其他允许抓取的网站。


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2020-07-08
    • 2020-11-28
    • 2022-01-22
    相关资源
    最近更新 更多