为什么汤不全部显示所有标签

如何解决为什么汤不全部显示所有标签

我正在尝试从此页面抓取每日温度数据-特别是最低和最高每日温度:https://www.wunderground.com/calendar/gb/birmingham/EGBB/date/2020-8

我在html中找到了数据所在的行: calendar days temperature li tag 其余的每日温度也可以在其他li标签中找到: other li tags where temp data is inside

我正在尝试使用漂亮的汤来抓取所述数据,但是当我尝试使用以下代码时,即使从html处检查html时,即使它们在那里,我也无法从html中获取所有li标记。网站

当我打印生成的temp_cont时,还有其他li标签,但没有包含每日数据的标签:result of soup find all

我已经尝试使用其他html解析器,但是它不起作用-所有其他解析器输出相同的数据。 我正在寻找其他解决方案,例如尝试使用javascript加载它,因为其他人建议某些页面可能会动态加载,但我对此并不了解。 希望你能帮我这个忙。

response = get(url,headers=headers)
soup = BeautifulSoup(response.content,'lxml')
temp_cont = soup.find_all('li')

编辑(附加问题): 我在下面测试了@AaronS推荐的解决方案,并且抓取效果很好。但是,当我尝试在几个小时后再次重新运行脚本时,由于list元素之一为“ None”,则提示“ Nonetype”错误。

当我在API的网络预览中再次检查该网站时,temperatureMax的第一个元素现在被写为“ null”。我不知道为什么/如何更改它,或者是否有变通办法以使抓取再次起作用。在此处查看屏幕截图:network preview with null

解决方法

因此,如果您在浏览器中禁用了javascript,则会发现那里没有您需要的信息。这就是罗曼正在解释的。 Javascript可以发出HTTP请求并从API中获取数据,然后将响应反馈给浏览器。

如果您检查页面并转到网络工具。您将能够看到所有加载页面的请求。在这些请求中,有一个请求,如果单击并预览,则会看到一些温度数据。

enter image description here

我很懒,所以我复制了此请求的cURL并将其输入到curl.trillworks.com这样的网站中,该网站将其转换为python请求。

enter image description here

在这里您可以看到我正在此处复制cURL请求。

代码示例

import requests

params = (
    ('apiKey','6532d6454b8aa370768e63d6ba5a832e'),('geocode','52.45,-1.75'),('language','en-US'),('units','e'),('format','json'),)

response = requests.get('https://api.weather.com/v3/wx/forecast/daily/15day',params=params)
max = response.json()['temperatureMax'][0]
min = response.json()['temperatureMin'][0]
print('Min Temperature: ',min)
print('Max Temperature: ',max)

输出

Min Temperature: 65
Max Temperature: 87

解释

因此,URL是weather.com具有的每日预报的API。它具有用于指定您所在位置的参数,以及响应应返回的格式。

我们使用这些参数发出HTTP get请求,而返回的响应是JSON对象。我们可以使用response.json()方法将其转换为python字典。

现在,如果输出response.json(),您将获得大量数据,如果您在浏览器中查看该HTTP请求的预览,则可以向下浏览所需的数据。我们需要键“ temperatureMax”和“ temperatureMin”中的数据。结果实际上是一个列表,而今天的温度最大值和最小值是这些列表的第一项。因此,response.json()['temperatureMax'][0]min = response.json()['temperatureMin'][0]

其他信息

这是网站包含由javascript加载的动态内容的情况。处理这类内容有两种主要方法。

  1. 模仿javascript调用的HTTP请求(这是我们在这里所做的事情)
  2. 使用selenium之类的包来调用浏览器活动。您可以使用selenium呈现整个HTML,包括该HTML的javascript调用部分。然后选择所需的数据。

第一个选择的好处是效率,更快,数据更结构化。认为最后一种工作是最后一种选择的原因是硒从来都不是用于网络抓取的,它很脆弱,如果网站上发生任何更改,那么您将处于需要经常维护代码的位置。 / p>

所以我的建议是尝试做第一个选择,检查页面,转到网络工具,然后查看所有请求的预览。预览数据,看看它是否具有您想要的。然后重新创建该请求。现在有时候您只需要一个简单的HTTP请求,而没有参数,Cookie或标头。

在此特定示例中,您调整了参数,但有时您可能需要全部,甚至可能需要更多不同的网站。因此请注意,如果您无法获取数据。这不是万无一失的证据,肯定有一些实例很难重新创建HTTP请求,并且您作为网站用户对某些事情并不确定。请使用具有此功能的完善的API来阻止人们对其进行抓取。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-