python-3.x - JavaScript 后显示 <-!--Content End--> 时如何提取数据?
问题描述
我刚开始学习python。为了学术目的,我想每三个小时提取一次玻璃温度数据。该网站如下:
https://www.weather.gov.hk/wxinfo/ts/display_graph_grass_e.htm?kp&
我尝试使用 BeautifulSoup 使用以下脚本提取数据。结果如下:
在我找到想要的数据之前,JavaScript 后面有一个 <!--Content End-->,我无法抓取它后面的脚本。为什么会发生这种情况以及是否有任何解决方案?
解决方案
数据作为 Javascript 存储Array
在 HTML 页面中。我们可以使用re
and 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
推荐阅读
- php - $.ajax 不是函数 - 与引导程序冲突?
- php - cURL 无法连接到特定的 https 站点
- powershell - PowerShell看门狗杀死进程树
- elasticsearch - Elasticsearch:如何找出一个值是否与列表中的任何值匹配?
- go - 如何在不使用尾指针的情况下实现双向链表
- reactjs - 如何在 React 应用程序中允许用户格式化?
- go - 转换具有单个混合数据类型数组的单个字符串
- c# - LINQ .Where 查询需要 5 分钟以上才能执行
- image - 为什么“onmouseover”不能在通过 Netlify 启动的实时网站上运行?
- flutter - 在颤动中链接两个页面浏览量