首页 > 解决方案 > JavaScript 后显示 <-!--Content End--> 时如何提取数据?

问题描述

我刚开始学习python。为了学术目的,我想每三个小时提取一次玻璃温度数据。该网站如下:

https://www.weather.gov.hk/wxinfo/ts/display_graph_grass_e.htm?kp&

在此处输入图像描述

我尝试使用 BeautifulSoup 使用以下脚本提取数据。结果如下:

在此处输入图像描述

在我找到想要的数据之前,JavaScript 后面有一个 <!--Content End-->,我无法抓取它后面的脚本。为什么会发生这种情况以及是否有任何解决方案?

标签: python-3.xbeautifulsoup

解决方案


数据作为 Javascript 存储Array在 HTML 页面中。我们可以使用reand ast.literal_eval( doc ) 来检索它:

import re
import requests
from ast import literal_eval

url = 'https://www.weather.gov.hk/wxinfo/ts/display_graph_grass_e.htm?kp&'

html_text = requests.get(url).text

station_code = literal_eval(re.findall(r'StationCode\s*=.*?(\(.*?\))', html_text)[0])
station_name = literal_eval(re.findall(r'stnname\s*=.*?(\(.*?\))', html_text)[0])
station_height = literal_eval(re.findall(r'stn_height\s*=.*?(\(.*?\))', html_text)[0])
grass_temp = literal_eval(re.findall(r'grasstemp\s*=.*?(\(.*?\))', html_text)[0])
min_since_17 = literal_eval(re.findall(r'minSince17\s*=.*?(\(.*?\))', html_text)[0])
min_hour = literal_eval(re.findall(r'minHour\s*=.*?(\(.*?\))', html_text)[0])
min_minute = literal_eval(re.findall(r'minMinute\s*=.*?(\(.*?\))', html_text)[0])

rows = [*zip(station_code, station_name, station_height, grass_temp, min_since_17, min_hour, min_minute)]

headers = ['Station Code', 'Station Name', 'Station Height', 'Grass Temp', 'Min_since_17', 'Min Hour', 'Min Minute']
print(''.join('{: <20}'.format(d) for d in headers))
for row in rows:
    print(''.join('{: <20}'.format(d) for d in row))

印刷:

Station Code        Station Name        Station Height      Grass Temp          Min_since_17        Min Hour            Min Minute          
kp                  King's Park         65                  25.4                25.3                23                  35                  
tkl                 Ta Kwu Ling         15                  25.4                24.8                17                  00                  
tms                 Tai Mo Shan         955                 21.3                21.3                07                  19                  

推荐阅读