与桌子断裂的美丽的汤刮表

问题描述 投票:1回答:1

我正试图将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

谢谢你的帮助。

python dataframe web-scraping beautifulsoup
1个回答
2
投票

如果你检查你的html响应(汤),你会看到你在这行table_regions = soup.find('table', {'class': "t4"})中得到的表标签在包含你需要的信息的行之前关闭了(包含带有类名的td的那些:up dn d1 and 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]切片,因为它包含网站的所有td。如果需要,您也可以使用其余部分。

© www.soinside.com 2019 - 2024. All rights reserved.