网页抓取的数据定相不正确

时间:2018-03-12 12:11:10

标签: python web-scraping

我正在尝试从网站中提取表格的值,并将数据编译成pandas数据帧。 http://lbma.oblive.co.uk/table 但是,我有几个问题。

  1. 我只能在需要所有五个字段时选择默认金价。即金,银,GOFO / LIBOR,铂和钯。

  2. 数据输出似乎分阶段不正确。即,它显示为单个数组,而不是网站中正确的行和列。

  3. 下面是我尝试进行网页抓取的相当简单的代码,但它对于工作来说相当不足。希望你们能帮忙。

    #Import packages
    import requests
    import pandas as pd
    from bs4 import BeautifulSoup
    
    #Define url and output data
    url = "http://lbma.oblive.co.uk/table"
    data = pd.read_html(requests.get(url).text)
    df = pd.DataFrame(data)
    print(df)
    

    输出:

    0     Timestamp:2018-03-12 10:31:00 +0000      US...
    

1 个答案:

答案 0 :(得分:1)

通过从HTML选项菜单中选择金属类型,可以实现完整的URL:

from bs4 import BeautifulSoup as soup
import urllib
import pandas as pd
metals = map(lambda x:str(x).lower(), [i.text for i in soup(str(urllib.urlopen('http://lbma.oblive.co.uk/table?metal=silver&year=2018&type=daily').read()), 'lxml').find_all('option')])[:5]
dataframes = []
for metal in metals:
  table_results = [i.text for i in soup(str(urllib.urlopen('http://lbma.oblive.co.uk/table?metal={}&year=2018&type=daily'.format(metal)).read()), 'lxml').find_all('td')]
  new_table_data = {metal:[dict(zip(['timestamp', 'USD', 'GBP', 'EUR'], table_results[i:i+4])) for i in range(0, len(table_results), 4)]}
  dataframes.append(pd.DataFrame.from_dict(new_table_results,orient='index').transpose())