我如何用漂亮的汤解析来自雅虎财经的信息
how do I parse info from yahoo finance with beautiful soup
到目前为止,我已经使用 soup.findAll('span')
<span data-reactid="12">Previous Close</span>,
<span class="Trsdu(0.3s) " data-reactid="14">5.52</span>,
<span data-reactid="17"></span>,
<span class="Trsdu(0.3s) " data-reactid="19">5.49</span>,
<span data-reactid="38">Volume</span>,
<span class="Trsdu(0.3s) " data-reactid="40">1,164,604</span>,
...
我想要一个能给我看的桌子
Open 5.49
Volume 1,164,604
...
我试过 soup.findAll('span').text 但它给出了错误消息:
ResultSet object has no attribute 'text'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?
这是来源:
https://finance.yahoo.com/quote/gxl.ax?p=gxl.ax
幸运的是错误给了我们一个提示:
You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?
尝试以下方法之一:
soup.findAll('span')[0].text
soup.findAll('span')[i].text
soup.find('span').text
这是导航许多选择器系统时的普遍问题,包括 CSS 个选择器。要对元素进行操作,它必须是单个元素而不是集合。 findAll()
returns 一个集合(数组),因此您可以索引到该数组(例如 [i]
)或找到与 find()
.
的第一个匹配项
soup.findAll('span')
将在 ResultSet
中 return object/elements。您必须遍历这些才能打印文本。所以尝试:
spans = soup.findAll('span')
for ele in spans:
data = ele.text
print(data)
获取输出并放入数据框:
your_output = ['Previous Close', '5.52', 'Open', '5.49', 'Bid', 'Ask', "Day's Range", '52 Week Range', 'Volume', '1,164,604', 'Avg. Volume', '660,530']
headers = your_output[::2]
data = your_output[1::2]
df = pd.DataFrame([data], columns = headers)
额外
您当然可以使用 BeautifulSoup 通过遍历元素来解析并放入数据框。我想提供 BeautifulSoup 的替代方案。
如果 Pandas 可以使用 .read_html
识别 html 中的 table,则它可以为您完成大部分工作。您可以使用它来实现 table 的数据帧类型。
import pandas as pd
tables = pd.read_html(url)
df = pd.concat( [ table for table in tables ] )
输出:
print (df)
0 1
0 Previous Close 5.50
1 Open 5.50
2 Bid 5.47 x 0
3 Ask 5.51 x 0
4 Day's Range 5.47 - 5.51
5 52 Week Range 3.58 - 6.49
6 Volume 634191
7 Avg. Volume 675718
0 Market Cap 660.137M
1 Beta (3Y Monthly) 0.10
2 PE Ratio (TTM) 31.49
3 EPS (TTM) 0.17
4 Earnings Date NaN
5 Forward Dividend & Yield 0.15 (2.82%)
6 Ex-Dividend Date 2019-02-12
7 1y Target Est 5.17
到目前为止,我已经使用 soup.findAll('span')
<span data-reactid="12">Previous Close</span>,
<span class="Trsdu(0.3s) " data-reactid="14">5.52</span>,
<span data-reactid="17"></span>,
<span class="Trsdu(0.3s) " data-reactid="19">5.49</span>,
<span data-reactid="38">Volume</span>,
<span class="Trsdu(0.3s) " data-reactid="40">1,164,604</span>,
...
我想要一个能给我看的桌子
Open 5.49
Volume 1,164,604
... 我试过 soup.findAll('span').text 但它给出了错误消息:
ResultSet object has no attribute 'text'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?
这是来源:
https://finance.yahoo.com/quote/gxl.ax?p=gxl.ax
幸运的是错误给了我们一个提示:
You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?
尝试以下方法之一:
soup.findAll('span')[0].text
soup.findAll('span')[i].text
soup.find('span').text
这是导航许多选择器系统时的普遍问题,包括 CSS 个选择器。要对元素进行操作,它必须是单个元素而不是集合。 findAll()
returns 一个集合(数组),因此您可以索引到该数组(例如 [i]
)或找到与 find()
.
soup.findAll('span')
将在 ResultSet
中 return object/elements。您必须遍历这些才能打印文本。所以尝试:
spans = soup.findAll('span')
for ele in spans:
data = ele.text
print(data)
获取输出并放入数据框:
your_output = ['Previous Close', '5.52', 'Open', '5.49', 'Bid', 'Ask', "Day's Range", '52 Week Range', 'Volume', '1,164,604', 'Avg. Volume', '660,530']
headers = your_output[::2]
data = your_output[1::2]
df = pd.DataFrame([data], columns = headers)
额外
您当然可以使用 BeautifulSoup 通过遍历元素来解析并放入数据框。我想提供 BeautifulSoup 的替代方案。
如果Pandas 可以使用 .read_html
识别 html 中的 table,则它可以为您完成大部分工作。您可以使用它来实现 table 的数据帧类型。
import pandas as pd
tables = pd.read_html(url)
df = pd.concat( [ table for table in tables ] )
输出:
print (df)
0 1
0 Previous Close 5.50
1 Open 5.50
2 Bid 5.47 x 0
3 Ask 5.51 x 0
4 Day's Range 5.47 - 5.51
5 52 Week Range 3.58 - 6.49
6 Volume 634191
7 Avg. Volume 675718
0 Market Cap 660.137M
1 Beta (3Y Monthly) 0.10
2 PE Ratio (TTM) 31.49
3 EPS (TTM) 0.17
4 Earnings Date NaN
5 Forward Dividend & Yield 0.15 (2.82%)
6 Ex-Dividend Date 2019-02-12
7 1y Target Est 5.17