Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检索图形信息web抓取

检索图形信息web抓取
EN

Stack Overflow用户
提问于 2021-06-28 07:31:40
回答 2查看 70关注 0票数 2

我是新来的网页抓取,我需要一些帮助,我的查询。在这个页面上,https://ski-resort-stats.com/Hemsedal/,节雪历史,我正试图检索图表上的信息(每年降雪)。我正试图从一年(2013-2014年)开始。

我想我找到了html代码中关联的部分:从html代码中截图

为此:

代码语言:javascript
运行
AI代码解释
复制
from bs4 import BeautifulSoup                                                                         
import requests

url="https://ski-resort-stats.com/Hemsedal/"                                              
html_content = requests.get(url).text
soup = BeautifulSoup(html_content, "lxml")                             
gdp_table = soup.find("g", attrs={"class": "highcharts-markers highcharts-series-0 highcharts-spline-series highcharts-color-0 highcharts-tracker"})                                                                       
gdp_table_data = gdp_table.tbody.find_all("path")`

但是我正在引导这个错误:"AttributeError:'NoneType‘对象没有属性'tbody'“。与html代码中的其他元素一起尝试,但没有成功。有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-28 10:32:48

数据以JavaScript形式嵌入到页面中。您可以使用这个例子来解析它:

代码语言:javascript
运行
AI代码解释
复制
import re
import json
import requests

url = "https://ski-resort-stats.com/Hemsedal/"
html_doc = requests.get(url).text

data = re.search(r"wpDataCharts\[.*?\] = ({.*})", html_doc).group(1)
data = re.sub(r"([a-z_]+):", r'"\1":', data)
data = re.sub(r'"http":', "http:", data)
data = json.loads(data)

# uncomment this to print all data:
# print(json.dumps(data, indent=4))

for series in data["render_data"]["options"]["series"]:
    print(series["name"], series["data"])

print()
print("week =", data["render_data"]["options"]["xAxis"]["categories"])

指纹:

代码语言:javascript
运行
AI代码解释
复制
2013-2014 [0, 0, 0, 25, 28, 36, 36.5, 53.5, 77.5, 89.5, 125.5, 151.5, 159.5, 163.5, 177.5, 173.5, 175, 166, 171, 173.5, 169.5, 166, 158.5]
2014-2015 [0, 0, 0, 52, 70, 67, 74.5, 78, 74, 88, 98, 102, 109.5, 113, 113, 109.5, 110.5, 98, 95, 95, 99, 108, 102]
2015-2016 [0, 0, 0, 11.5, 25.5, 34, 37, 52, 64, 76, 82, 73, 79, 105, 118, 120, 136, 141, 116, 116, 100, 97, 95]
2016-2017 [0, 0, 0, 42, 33, 22, 17, 31, 25, 40, 47, 22, 15, 17, 15, 20, 47, 50, 63, 59, 57, 51, 50]
2017-2018 [10, 10, 40, 66, 64, 64, 48, 67, 77, 85, 120, 120, 140, 155, 175, 175, 175, 175, 175, 168, 170, 180, 180]
2012-2013 [0, 0, 0, 61.5, 60, 61, 76.5, 90.5, 95, 85, 85, 85, 87.5, 100, 102.5, 102.5, 100.5, 104, 101, 100, 99, 97.5, 95]
2018-2019 [0, 0, 0, 0, 23, 33, 48, 49, 50, 75, 68, 68, 115, 115, 115, 80, 80, 85, 85, 110, 110, 110, 110]
2019-2020 [45, 45, 40, 80, 80, 80, 97, 107, 107, 107, 107, 113, 113, 113, 113, 118, 118, 127, 127, 0, 0, 0, 0]
week = [45, 46, 47, 48, 49, 50, 51, 52, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
票数 1
EN

Stack Overflow用户

发布于 2021-06-28 09:03:04

正如@joni所指出的,该站点在最初加载javascript之后运行javascript,以便用图形数据填充页面。下面的代码使用selenium加载页面,获取2013-2014图形上的数据点元素,然后悬停在每个点上,从而使包含实际数据的信息工具提示可见:

代码语言:javascript
运行
AI代码解释
复制
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
d = webdriver.Chrome('/path/to/chromedriver')
d.get('https://ski-resort-stats.com/Hemsedal/')
results = []
for i in d.execute_script('''return document.querySelectorAll('g > path[fill="#7cb5ec"]')''')[:-1]:
    a = ActionChains(d)
    a.move_to_element(i).perform()
    time.sleep(0.3)
    results.append(d.execute_script('''
     function* get_hover_data(y_range){
         for (var i of document.querySelectorAll('text[x="8"][data-z-index="1"][y="18"]')){
             if (i.children.length === 5){
                 yield [i.children[0].textContent, i.children[3].textContent]
             }
         }

     }
     return [...get_hover_data('2013-2014')];
    '''))

_, *final_results = [i[0] for i in results if i]

输出:

代码语言:javascript
运行
AI代码解释
复制
[['45', '0'], ['46', '0'], ['47', '0'], ['48', '25'], ['49', '28'], ['50', '36'], ['51', '37'], ['52', '53,5'], ['1', '77,5'], ['2', '89,5'], ['3', '125,5'], ['4', '151,5'], ['5', '159,5'], ['6', '163,5'], ['7', '177,5'], ['8', '173,5'], ['9', '175'], ['10', '166'], ['11', '171'], ['12', '173,5'], ['13', '170'], ['14', '166'], ['15', '158,5']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68166135

复制
相关文章
在Keras中如何对超参数进行调优?
由于没有一个成熟的理论来解释神经网络,所以配置神经网络通常是困难的,经常被同学们调侃为“炼丹”。
花落花飞去
2018/02/05
16.9K2
在Keras中如何对超参数进行调优?
在 Linux/Mac 下为Python函数添加超时时间
我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans*[1] 这篇文章中作者的举例,我们不考虑这种特殊情况)。
青南
2020/02/26
1.1K0
在 Linux/Mac 下为Python函数添加超时时间
手把手教你在本机安装spark
最近由于一直work from home节省了很多上下班路上的时间,加上今天的LeetCode的文章篇幅较小,所以抽出了点时间加更了一篇,和大家分享一下最近在学习的spark相关的内容。看在我这么拼的份上,求各位老爷赏个转发。。。
TechFlow-承志
2020/04/14
4.4K0
Jira Epic在完成状态时,如何让Epic在Scrum面板待办事项中不显示?
遇到的问题:Epic在完成状态时,仍旧在Scrum面板待办事项中显示,需要手动将其【标记完成】 而想要的效果是:Epic到完成状态时,Epic自动标记完成
donghui
2019/04/19
2.9K0
Jira Epic在完成状态时,如何让Epic在Scrum面板待办事项中不显示?
日本机器人“赢在技术输在商业” 谁之过?
据《金融时报》网站报道,去年当谷歌收购由2位日本机器人工程师创办的一家微型新创公司Schaft时,让人们对日本面临的威胁突然有了新的认识。包括苹果和亚马逊等新科技公司对机器人技术日益感兴趣。 时
机器人网
2018/04/13
7070
日本机器人“赢在技术输在商业” 谁之过?
在Centos下对Tornado的性能进行测试
    在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的后端服务进行性能测试,得出结论单台django在简单读库操作下只能抗住大约200左右的并发:在Centos下使用Siege对Django服务进行压力测试
用户9127725
2022/08/08
7630
在Centos下对Tornado的性能进行测试
PECVD等离子增强化学沉积技术
纳米涂层(what)是一种功能性、柔性纳米级厚度的薄膜,具有疏水疏油特性。原理(how)在低温真空腔体内,等离子激发反应气体,在基材(被保护的PCBA)表面开启化学反应,生成纳米级厚度的网状保护膜(防泼溅、防潮、疏水、疏油,防腐蚀、防盐雾、防汗液)。气体沉积工艺保证了全面覆盖(内外,缝隙),均匀性,批量处理,牢固性。
用户10405156
2023/03/06
3210
如何通过VPC在本机搭建局域网
前几天在家里测试一个基于WS-AT的分布式应用,但是连接公司网络的VPN出现了问题,不得不采用VPC在本机搭建一个局域网。虽然以前也做过这样的尝试,可能是很久没有弄过了,一些细节记不清了,所以也折腾了好一阵子。在这里,我特意写一篇文章来介绍基于VPC搭建局域网的整个步骤,没有什么技术含量,只当给具有相同需要的朋友多一个参考。 我现在的Host Machine为Windows 7 Ultimate (X64) ,Virtual Machine为Windows Server 2008 (X86),都是现成的。本
蒋金楠
2018/01/16
2.4K0
如何通过VPC在本机搭建局域网
测试人员在技术面试时的注意事项
过完年了,有很多兄弟姐妹们开始春心萌动了,额不对,是物色新工作机会了,所以小编在此整理了一些面试相关的文章,希望对大家有所帮助!
张树臣
2019/03/04
6330
测试人员在技术面试时的注意事项
在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。 至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。 1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexChanged,在于这个
用户1653704
2018/06/07
1.7K0
对测试技术在团队的一个简单思考
测试技术带来的是PPT工具还是紧贴业务,服务于业务的小工具,小脚本,PPT工具大部分可能带来的是高大尚的平台,无效不实用,投入成本高,主要用于晋升和给自己镀金的作用;而小脚本,小工具不高大尚,作用大,感觉替代性高,一直在业务线上,没有发展前途,对以后前途和职业发展来讲是阻碍;也许可能是跪久了,站不起来了,迷路了,不知道 南橘北枳这个成语吗?所以测试技术要符合自己的团队和业务进行发展才是最实在的,太虚了,经济不景气,裁的就是这些;
厦门-安仔
2023/03/07
2320
对测试技术在团队的一个简单思考
在Centos下使用Siege对Django服务进行压力测试
    Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试。今天我们就使用Siege来对Django进行一次压力测试,看看单台Django服务到底能抗住多少的并发数。
用户9127725
2022/08/08
1.6K0
在Centos下使用Siege对Django服务进行压力测试
微信小程序----wx.getLocation(OBJECT) API在iOS关闭本机定位时,获取定位失败
问题 在做一个小程序时,进入首页需要获取用户的当前位置经纬度,然后去服务器查询当前位置周边的网吧。在安卓关闭定位设置时,wx.getLocation(OBJECT) API依然能够获取当前位置的经纬度;但是iOS如果关闭定位设置,wx.getLocation(OBJECT) API就会失败! 解决办法 微信小程序社区解决办法 根据官网解决的实际用法 Page({ onShow(){ // 获取当前地址 wx.getLocation({
Rattenking
2021/02/01
1.4K0
CPU 摸鱼时,在干嘛?
假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛?
小林coding
2021/03/30
7820
CPU 摸鱼时,在干嘛?
在定义adt时_ScriptableObject
Mutators 变值器(改变对象属性的方法) 通常范围void,如果返回void,则必然意味着它改变了某些对象的内部状态,也可能范围非空类型(如容器类的put、add方法)
全栈程序员站长
2022/10/02
3060
curl在CDN排障中的常见用法
-I Show document info only 只展示headers,发起HEAD请求 -o Write output to file instead of stdout 保存到本地 -x 用这个option可以指定http访问所使用的proxy服务器及其端口 -v Make the operation more talkative 可以显示一次http通信的整个过程,包括端口连接和http -H Custom header to pass to server 添加header -A/–user-agent [string] 指定UA访问 -e, --referer URL 指定referer --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS -X -d 这里的X是大写,-X POST发起POST请求
邪恶の大灰
2019/04/29
3.6K0
点击加载更多

相似问题

goBack屏在排毒测试中的应用

60

排毒只测试飞溅屏

10

排毒测试还没有完成

10

在反应本机溅屏中显示ActivityIndicator 5秒

110

如何使用react本机-i18n在排毒[反应-本机]

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档