网络抓取问题:无法使用特斯拉股票价格从 MacroTrends 中检索正确的表格(季度股票价格)

时间:2021-03-10 05:06:36

标签: python pandas web-scraping beautifulsoup

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

1 个答案:

答案 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}并按回车键。然后您可以在比赛中循环。

enter image description here

您可以在此处阅读有关 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 或其他允许抓取的网站。