Python 网络抓取问题:无法使用特斯拉股价从宏观趋势中检索正确的表(季度股价)

Python 网络抓取问题:无法使用特斯拉股价从宏观趋势中检索正确的表(季度股价),python,pandas,web-scraping,beautifulsoup,Python,Pandas,Web Scraping,Beautifulsoup,我想将特斯拉的季度收入数据导入熊猫数据框架。我继续提取年度收入表(两个表在网页上并排显示)。我需要如何修改代码以提取季度收入?提前谢谢 ```html_data = requests.get('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue').text soup = BeautifulSoup(html_data, 'html5lib') tesla_revenue = pd.DataFrame(columns=['

我想将特斯拉的季度收入数据导入熊猫数据框架。我继续提取年度收入表(两个表在网页上并排显示)。我需要如何修改代码以提取季度收入?提前谢谢

```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```

要坚持使用您的方法,您可以使用以下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,然后移动到具有类(.)historical_data_table的表元素,最后,通过后代组合器(),选择其中的所有行tr

您可以在浏览器的“元素”选项卡中测试css,方法是按F12,然后按Ctrl+F,然后输入css
#style-1 div+div.historical_data_table tr
,然后按enter键。然后可以循环进行匹配

您可以在此处阅读有关css选择器的信息:


Py pandas\u html:

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) 
尽管如此,那里仍有许多不必要的工作在进行

您可以更轻松地使用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
-您将看到第二个实际的table元素匹配是您想要的

如果检查页面源(右键单击view source),您将找到该表,这意味着内容是静态的,read_html可以读取它(除非请求头是必需的)


刮削:

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) 
根据@MichaellongStretch的有益评论

请阅读手册,了解是否允许刮削。如果这是不允许的,寻找一个公共API服务相同的数据或其他网站,允许刮



要坚持使用您的方法,您可以使用以下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,然后移动到具有类(.)historical_data_table的表元素,最后,通过后代组合器(),选择其中的所有行tr

您可以在浏览器的“元素”选项卡中测试css,方法是按F12,然后按Ctrl+F,然后输入css
#style-1 div+div.historical_data_table tr
,然后按enter键。然后可以循环进行匹配

您可以在此处阅读有关css选择器的信息:


Py pandas\u html:

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) 
尽管如此,那里仍有许多不必要的工作在进行

您可以更轻松地使用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
-您将看到第二个实际的table元素匹配是您想要的

如果检查页面源(右键单击view source),您将找到该表,这意味着内容是静态的,read_html可以读取它(除非请求头是必需的)


刮削:

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) 
根据@MichaellongStretch的有益评论

请阅读手册,了解是否允许刮削。如果这是不允许的,寻找一个公共API服务相同的数据或其他网站,允许刮



您可以使用read_html from pandas
将pandas导入为pd;table=pd.read\u html('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue“)[1]
汤。选择一个(“#style-1 div+div.history_data_table”)
在删除此站点之前确保阅读。您可以使用read_html from pandas
将pandas导入为pd;table=pd.read\u html('https://www.macrotrends.net/stocks/charts/TSLA/tesla/revenue“)[1]
汤。选择一个(“#style-1 div+div.history_data_table”)
请确保在删除此站点之前阅读。