代码之家  ›  专栏  ›  技术社区  ›  ezeagwulae

美丽的汤刮桌子与桌子休息

  •  1
  • ezeagwulae  · 技术社区  · 6 年前

    我在试着刮 table 数据帧中。我的尝试只返回表名,而不返回每个区域行中的数据。

    这就是我目前为止所拥有的:

    from bs4 import BeautifulSoup as bs4
    import requests
    
    url = 'https://www.eia.gov/todayinenergy/prices.php'
    r = requests.get(url)
    soup = bs4(r.text, "html.parser")
    
    table_regions = soup.find('table', {'class': "t4"})
    regions = table_regions.find_all('tr')
    
    for row in regions:
        print row
    

    我想得到的理想结果是:

    region         | price   
    ---------------|-------
    new england    | 2.59
    new york city  | 2.52
    

    谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alejandro Lorefice    6 年前

    如果您检查HTML响应(soup),您将看到您在这行中得到的表标记 table_regions = soup.find('table', {'class': "t4"}) 它在包含所需信息的行(包含具有类名的td的行:up dn d1和s1)之前关闭。 那么使用这样的原始td标签如何:

    from bs4 import BeautifulSoup as bs4
    import requests
    import pandas as pd
    
    url = 'https://www.eia.gov/todayinenergy/prices.php'
    r = requests.get(url)
    soup = bs4(r.text, "html.parser")
    
    a = soup.find_all('tr')
    rows = []
    subel = []
    
    for tr in a[42:50]:
        b = tr.find_all('td')
        for td in b:
            subel.append(td.string)
        rows.append(subel)
        subel = []
    
    df = pd.DataFrame(rows, columns=['Region','Price_1', 'Percent_change_1', 'Price_2', 'Percent_change_2', 'Spark Spread'])
    

    注意我只使用 a[42:50] 由于a包含网站的所有td,所以将结果切片。如果需要的话,你也可以用剩下的。