python - 使用Python从html中提取列(Beautifulsoup)

标签 python html web-scraping

我需要从此页面提取信息 - http://www.investing.com/currencies/usd-brl-historical-data 。我需要日期、价格、开盘价、最高价、最低价、变化百分比。 我是 Python 新手,所以我陷入了这一步:

import requests
from bs4 import BeautifulSoup
from datetime import datetime

url='http://www.investing.com/currencies/usd-brl-historical-data'
r = requests.get(url)

soup=BeautifulSoup(r.content,'lxml')

g_data = soup.find_all('table', {'class':'genTbl closedTbl historicalTbl'})

d=[]

for item in g_data:
Table_Values = item.find_all('tr')
N=len(Table_Values)-1

for n in range(N):
    k = (item.find_all('td', {'class':'first left bold noWrap'})[n].text)

    print(item.find_all('td', {'class':'first left bold noWrap'})[n].text)

这里我有几个问题:

价格列可以标记为 或 。 如何指定我想要带有 class = 'redFont' 或/和 'greenfont' 标记的项目?。另外,Change % 还可以有 redFont 和 greenFont 类。其他列用 标记。 如何提取它们?

有没有办法从表中提取列?

理想情况下,我想要一个包含日期、价格、开盘价、最高价、最低价、变化百分比列的日期框架。

谢谢

最佳答案

如何解析该站点的表格我已经回答过 here但由于您想要一个 DataFrame,只需使用 pandas.read_html

url = 'http://www.investing.com/currencies/usd-brl-historical-data'
r = requests.get(url)


import pandas as pd

df = pd.read_html(r.content,attrs = {'id': 'curr_table'})[0]

这会给你:

            Date   Price    Open    High     Low Change %
0   Jun 08, 2016  3.3609  3.4411  3.4465  3.3584   -2.36%
1   Jun 07, 2016  3.4421  3.4885  3.5141  3.4401   -1.36%
2   Jun 06, 2016  3.4896  3.5265  3.5295  3.4840   -1.09%
3   Jun 05, 2016  3.5280  3.5280  3.5280  3.5280    0.11%
4   Jun 03, 2016  3.5240  3.5910  3.5947  3.5212   -1.91%
5   Jun 02, 2016  3.5926  3.6005  3.6157  3.5765   -0.22%
6   Jun 01, 2016  3.6007  3.6080  3.6363  3.5755   -0.29%
7   May 31, 2016  3.6111  3.5700  3.6383  3.5534    1.11%
8   May 30, 2016  3.5713  3.6110  3.6167  3.5675   -1.11%
9   May 27, 2016  3.6115  3.5824  3.6303  3.5792    0.81%
10  May 26, 2016  3.5825  3.5826  3.5857  3.5757   -0.03%
11  May 25, 2016  3.5836  3.5702  3.6218  3.5511    0.34%
12  May 24, 2016  3.5713  3.5717  3.5903  3.5417   -0.04%
13  May 23, 2016  3.5728  3.5195  3.5894  3.5121    1.49%
14  May 20, 2016  3.5202  3.5633  3.5663  3.5154   -1.24%
15  May 19, 2016  3.5644  3.5668  3.6197  3.5503   -0.11%
16  May 18, 2016  3.5683  3.4877  3.5703  3.4854    2.28%
17  May 17, 2016  3.4888  3.4990  3.5300  3.4812   -0.32%
18  May 16, 2016  3.5001  3.5309  3.5366  3.4944   -0.96%
19  May 13, 2016  3.5340  3.4845  3.5345  3.4630    1.39%
20  May 12, 2016  3.4855  3.4514  3.5068  3.4346    0.95%
21  May 11, 2016  3.4528  3.4755  3.4835  3.4389   -0.66%
22  May 10, 2016  3.4758  3.5155  3.5173  3.4623   -1.15%
23  May 09, 2016  3.5164  3.5010  3.6766  3.4906    0.40%

您通常可以直接传递网址,但我们使用 urllib2(这是 read_html 使用的库)针对此特定站点收到 403 错误所以我们需要使用请求来获取该 html。

关于python - 使用Python从html中提取列(Beautifulsoup),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37714116/

相关文章:

excel - 将 Web 浏览器自动化转换为 XmlHTTP 请求

python - 将数据通过管道传输到 python 调试器并交互式编写 python 程序

python - 将 Keras 与 Spearmint 集成的问题

html - 需要帮助获得背景以比剪报更复杂的方式通过某些文本显示

php - 衡量性能/优化网站时的有用提示?

python - 如何使用Beautiful Soup提取<span>标签内容?

python - numpy dtype 错误 - (结构化数组创建)

python - 检查字符串是否可以在 Python 中转换为 float

html - 是否可以使用 em 或 % 向上移动文本?

java - 可在 for 循环内运行