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

复制
相关文章
在Cookie中存储对象
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/46955119
DannyHoo
2018/09/13
3.8K0
ArrayList在Java多线程中的应用
开发中,存在这样的业务逻辑,类似倒金字塔结构,下层数据需要基于上层的数据进行逻辑计算。设计思路是:定义一个全局变量upLayerList,来保存上一层的数据。每一层计算仅需要知道upLayerList就可以,不用关心上一层数据怎么获取。当前层计算完毕后,把结果赋值给upLayerList,留给下一层使用。
用户2146693
2019/08/08
1.5K0
ArrayList在Java多线程中的应用
Java中的ArrayList
在Java编程中,ArrayList是一种常用的动态数组,可以在运行时自动调整大小。本文将深入探讨ArrayList的底层实现,并通过性能分析来评估其优劣。
疯狂的KK
2023/08/08
2110
Java中的ArrayList
Java中ArrayList的用法
ArrayList类是一个特殊的数组--动态数组。来自于System.Collections命名空间;通过添加和删除元素,就可以动态改变数组的长度。
SingYi
2022/07/14
1.2K0
在Java中如何加快大型集合的处理速度
作者 | Nahla Davies 译者 | 明知山 策划 | 丁晓昀 本文讨论了 Java Collections Framework 背后的目的、Java 集合的工作原理,以及开发人员和程序员如何最大限度地利用 Java 集合。 1 什么是 Java 集合 尽管 Java 已经过了 25 岁生日,仍然是当今最受欢迎的编程语言之一。超过 100 万个网站通过某种形式在使用 Java,超过三分之一的软件开发人员的工具箱中有 Java。 Java 在它的整个生命历程中经历了重大的演变。一个早期的
深度学习与Python
2023/03/29
1.9K0
在Java中如何加快大型集合的处理速度
如何在ArrayList中存储不同类型的对象并按照类型输出数据
高久峰
2023/06/27
3750
Java中ArrayList的同步方法
arrayList 的实现是默认不同步的。这意味着如果一个线程在结构上修改它并且多个线程同时访问它,它必须在外部同步。结构修改意味着从列表中添加或删除元素或显式调整后备数组的大小。改变现有元素的值不是结构修改。
小锋学长生活大爆炸
2021/09/26
1.9K0
java中arraylist扩容问题_Arraylist扩容机制[通俗易懂]
当我们要 add 进第1个元素到 ArrayList 时,elementData.length 为0 (因为还是一个空的 list),因为执行了 ensureCapacityInternal() 方法 ,所以 minCapacity 此时为10。此时,minCapacity – elementData.length > 0成立,所以会进入 grow(minCapacity) 方法。
全栈程序员站长
2022/09/06
9790
Iterator在ArrayList中的源码实现
获取迭代器 List<LinkedHashMap> list = new ArrayList<>(); Iterator iterator = list.iterator(); iterator()方法实现 public Iterator<E> iterator() { return new Itr(); } Itr 源码 /** * An optimized version of AbstractList.Itr */ private class Itr imp
小小明童鞋
2018/06/13
1.1K0
SharedPreferences存储ArrayList
最近在做“桌面”项目(奶糖桌面),在做到“隐藏APP”的时候,是把要隐藏的APP(arraylist)包名拿出来,在获取全部APP(allapplist)的时候,把获取到的包名和所有APP包名做一个比较,如果存在的话就从allapplist中移除这一项。详情可参考以下代码:
奶油话梅糖
2021/03/16
9470
Java中ArrayList与LinkedList的区别
Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别:       1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。        2. 对于随机访问,ArrayList优于LinkedList       3. 对于插入和删除操作,LinkedList优于ArrayList   4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前
nnngu
2018/03/15
1.6K0
Java中Arraylist与linkedlist的区别
List: 有顺序的,元素可以重复 遍历:for 迭代 排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 遍历: ArrayList<String> al=new ArrayList(); al.add("winsun"); al.add("weixin"); al.add("mybole"); for(int i=0;i<al.size();i
闵开慧
2018/03/30
9720
Java 中的 Vector、Stack 与 ArrayList
引子:首先不得不说, Vector 与 Stack 这一对继承设计是蹩脚、失败的。
Fisherman渔夫
2020/02/17
1.1K0
Java中ArrayList集合的基本使用
概述: 要知道数组的长度是不可改变的 但是ArrayList集合的长度是可以随意变化的 1.创建 类型不能是基本数据类型 只能是引用数据类型 用基本数据类型的包装类就可以 //创建ArrayList集合 ArrayList<String> arrayList = new ArrayList<String>(); //int包装类 ArrayList<Integer> arrayList2 = new ArrayList<Integer>(); 对照表:
用户9006224
2022/12/21
6740
Java中ArrayList集合的基本使用
JAVA对象在JVM中内存分配
如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java的实例对象在内存中的空间分配(JDK1.8)。 public class Student { private String name; private static Birthday birthday = new Birthday(); public Student(String name) { this.name = name; } public sta
java404
2018/05/18
1.9K0
面试官:Java中实例对象存储在哪?
低级语言是计算机认识的语言、高级语言是程序员认识的语言。如何从高级语言转换成低级语言呢?这个过程其实就是编译。
Java宝典
2021/03/16
5970
Java 移动 ArrayList 中的元素的方法
原文地址:https://www.baeldung.com/java-arraylist-move-items
明明如月学长
2023/03/13
1.5K0
ArrayList实现原理分析(Java源码剖析)ArrayList使用的存储的数据结构ArrayList的初始化ArrayList是如何动态增长ArrayList如何实现元素的移除ArrayList
ArrayList是我们经常使用的一个数据结构,我们通常把其用作一个可变长度的动态数组使用,大部分时候,可以替代数组的作用,我们不用事先设定ArrayList的长度,只需要往里不断添加元素即可,ArrayList会动态增加容量。ArrayList是作为List接口的一个实现。 那么ArrayList背后使用的数据结构是什么呢? ArrayList是如何保证动态增加容量,使得能够正确添加元素的呢?
desperate633
2018/08/27
1.6K0
java之学习去除ArrayList中重复自定义对象元素
结果示意图: 前言: 很多时候或者很多项目中都会遇到集合中重复的部分,如何去除这些重复的部分呢?接下来小编就用创建新集合的方式去除集合中重复的部分。 原理: 原理就是创建新的集合 把旧的集合复制到新的
吾爱乐享
2018/07/12
1.7K0
在Java中将ArrayList转换为Array
In this tutorial you will learn how to convert ArrayList to Array in Java.
用户7886150
2021/04/29
1.8K0

相似问题

在ArrayList中存储对象时出错

20

如何检索存储在Java ArrayList中的对象值

60

在arraylist中存储对象

52

Java:如何存储和传输大型Integer-ArrayList

120

在java中存储要文件的大型JSON对象?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文