【问题标题】:Scraping a list of prices using Python使用 Python 抓取价格列表
【发布时间】:2020-02-07 21:23:47
【问题描述】:

我正在尝试分析这个网站上的数据:Electricity prices

我尝试使用 Beautiful Soup 来做到这一点:

from bs4 import BeautifulSoup
import requests
page = requests.get('https://transparency.entsoe.eu/transmission-domain/r2/dayAheadPrices/show?name=&defaultValue=false&viewType=TABLE&areaType=BZN&atch=false&dateTime.dateTime=01.10.2018+00:00%7CCET%7CDAY&biddingZone.values=CTY%7C10YAT-APG------L!BZN%7C10YAT-APG------L&dateTime.timezone=CET_CEST&dateTime.timezone_input=CET+(UTC+1)+/+CEST+(UTC+2)')
soup = BeautifulSoup(page.text, 'html.parser')
price_hide = soup.find(class_='dv-value-cell')
print(price_hide)

目前为止:

<td class="dv-value-cell">
<span       onclick="showDetail('eu.entsoe.emfip.transmission_domain.r2.presentation.entity.DayAheadPricesMongoEntity', '5bb0b150623a7295d97e9b6d', '2018-09-30T22:00:00.000Z', 'PRICE', 'CET');">59.53</span>

但是我如何刮掉整张桌子呢?

【问题讨论】:

  • 首先执行 price_hides = soup.find_all(class_='dv-value-cell') 以获取所有 td。然后 price_hide.text 获取价格。

标签: python html database web-scraping


【解决方案1】:

首先找到所有td标签,然后在每个标签中提取span标签内的文本值

timestamps=soup.find_all("td",class_="first")
prices=soup.find_all("td",class_="dv-value-cell")

for t,p in zip(timestamps,prices):
    print(t.text.strip()," ",p.span.text.strip())


00:00 - 01:00   59.53
01:00 - 02:00   56.10
02:00 - 03:00   51.41
03:00 - 04:00   47.38
04:00 - 05:00   47.59

【讨论】:

  • 谢谢!它适用于价格,但我想获取整个表格,包括时间戳。
【解决方案2】:

这就是你要找的吗?

from bs4 import BeautifulSoup
import requests
page = requests.get('https://transparency.entsoe.eu/transmission-domain/r2/dayAheadPrices/show?name=&defaultValue=false&viewType=TABLE&areaType=BZN&atch=false&dateTime.dateTime=01.10.2018+00:00%7CCET%7CDAY&biddingZone.values=CTY%7C10YAT-APG------L!BZN%7C10YAT-APG------L&dateTime.timezone=CET_CEST&dateTime.timezone_input=CET+(UTC+1)+/+CEST+(UTC+2)')
soup = BeautifulSoup(page.text, 'html.parser')
price_hide = soup.find_all(class_='dv-value-cell')
for price in price_hide:
    print(price.text.rstrip().lstrip())

输出如下:

59.53
56.10
51.41
47.38
47.59
51.61
69.13
77.32
...

【讨论】:

  • 谢谢!但是,我正在尝试获取整个表格,包括时间戳。我应该对另一列做同样的事情然后合并它们还是有更简单、更干净的方法?
【解决方案3】:

您需要使用soup.find_all() 而不是soup.find(),然后应用进一步的逻辑来提取所需的结果。

【讨论】:

    【解决方案4】:
    from bs4 import BeautifulSoup
    import requests
    page = requests.get('https://transparency.entsoe.eu/transmission-domain/r2/dayAheadPrices/show?name=&defaultValue=false&viewType=TABLE&areaType=BZN&atch=false&dateTime.dateTime=01.10.2018+00:00%7CCET%7CDAY&biddingZone.values=CTY%7C10YAT-APG------L!BZN%7C10YAT-APG------L&dateTime.timezone=CET_CEST&dateTime.timezone_input=CET+(UTC+1)+/+CEST+(UTC+2)')
    soup = BeautifulSoup(page.text, 'html.parser')
    price_hide = soup.find_all(['tr'])
    for price in price_hide:
        print(''.join(price.get_text("|", strip=True).split()))
    

    输出如下:

    MTU|Day-aheadPrice
    [EUR/MWh]
    00:00-01:00|59.53
    01:00-02:00|56.10
    02:00-03:00|51.41
    03:00-04:00|47.38
    04:00-05:00|47.59
    05:00-06:00|51.61
    06:00-07:00|69.13
    07:00-08:00|77.32
    08:00-09:00|84.97
    09:00-10:00|79.56
    10:00-11:00|73.70
    11:00-12:00|72.00
    12:00-13:00|65.20
    13:00-14:00|62.05
    14:00-15:00|61.96
    15:00-16:00|62.41
    16:00-17:00|61.98
    17:00-18:00|60.42
    18:00-19:00|69.93
    19:00-20:00|75.00
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2020-04-02
      • 1970-01-01
      • 2019-02-07
      • 2021-06-11
      • 2016-01-31
      • 1970-01-01
      • 2017-11-08
      相关资源
      最近更新 更多