记一次排错的过程

解析某网站的内容,用requests库获得html内容后,用BeautifulSoup来解析内容
其中有个标签大概这样,

代码流程大概这样

cookie = 'xxxxx'
r = requests.get(url, cookies = cookies)
    

    page = BeautifulSoup(r.text)
    page.find('div',class_ ='gh-ji')
    

结果始终说方法find()返回的是None,此前在类似的问题上坑过,有点印象但记不太清楚,这个class属性中间有空格,不能像正常时候一样写成class="ab-ef gh-ij"
这次我以为又写错了,百度、看网页源标签、看代码中间的-是否写错、甚至双引号换成单引号、看BeautifulSoup官网find()方法的介绍、等等,各种方法一通尝试,前后折腾一个多小时,精疲力尽银镜疼
最后快要放弃时,把r print出来看,根本没有获取到html内容,原来是cookie从浏览器上复制时复制错了

事情不大,代码简单,虽然最后也解决了,但还是很有必要总结下,结合以前的一些经验如下
1 在xx地方报错,xx地方当然要检查,但xx地方用到数据的来龙去脉都要检查,xx附近的代码(前面的和后面)都要检查
2 代码要写准确,多或少一个空格都不行

3 自己想到的方法都没有效果的话,就不要再去一个劲地和自己斗气了,我就容易犯这个毛病,暂时丢开,出去转一圈,放松心情,说不定在路上或者睡觉,起来后在检查几下就想到新的思路了,或者有问题的代码前后拍个照没事看看打发时间也是个办法
当时把能想到的方法都用过,仍不能解决,很可能已经走到死胡同了,不要斗气,放开自己,退一步海阔天空

本文转载于网络 如有侵权请联系删除

相关文章

  • 2021年大数据Spark(二十二):内核原理

    Spark内核原理Spark的核心是根据RDD来实现的,SparkScheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建DAG,基于DAG划分Stage,将每个Stage中的任务发到指定节点运行。基于Spark的任务调度原理,可以合理规划资源利用,做到尽可能用最少的资源高效地完成任务计算。以词频统计WordCount程序为例,Job执行是DAG图:​​​​​​​RDD依赖RDD的容错机制是通过将RDD间转移操作构建成有向无环图来实现的。从抽象的角度看,RDD间存在着血统继承关系,其本质上是RDD之间的依赖(Dependency)关系。从图的角度看,RDD为节点,在一次转换操作中,创建得到的新RDD称为子RDD,同时会产生新的边,即依赖关系,子RDD依赖向上依赖的RDD便是父RDD,可能会存在多个父RDD。可以将这种依赖关系进一步分为两类,分别是窄依赖(NarrowDependency)和Shuffle依赖(ShuffleDependency在部分文献中也被称为WideDepend

  • 程序员不容错过的开发利器

    前言:  现如今,技术发展十分迅猛,开发者只有通过不断的学习才能跟得上时代的步伐。而为了便于学习和工作(减少996),涌现了很多优秀的开发工具用以帮助开发者提高工作效率。现在我把我工作多年来收集实用的开发利器分享出来,希望能够给同学们参考借鉴(以下排名不分先后)。假如各位同学有更好的值得推荐的利器欢迎在文末留言或者去GitHub知识库中留下你宝贵的Issues。GitHub知识库地址:https://github.com/YSGStudyHards/DotNetGuide/issues VisualStudioVisualStudio2022预览版 比以往更快更可靠的64位VisualStudio。使用.NET6、Blazor、MAUI开发跨平台和云应用。在开发人员内部循环中跨.NET应用使用热重载功能。在Linux环境中生成、调试、测试.NET应用。一次向多达一行应用增强的IntelliCode完成。开发跨平台C++项目并轻松面向C++20。VisualStudio2019 更快地进行代码编写。更智能地执行操作。使用同类最佳IDE创建未来。VSCodeVSCode VisualStu

  • synchronized的工作原理(三)

    1.synchronized的锁存储以及锁分类存储位置:对象头的MarkWorkJVM的ObjectHeader信息MarkWord:hashcode(哈希code)+age(分代年龄age)+biased_lock(偏向锁标志)+lock(锁标志)ClassMetadataAddress(类元信息地址)ArrayLength:如果对象是一个数组类型,则存储数组长度对象的MarkWord信息JVM中synchronized使用的锁无锁:严格意义上应该说是正常对象,包含hashcode+分代年龄age+无偏向锁标志+锁状态标志轻量级锁:栈记录的地址+锁状态监视器锁:对象/监视器地址+锁状态GC标志:GC链接地址等+锁状态偏向锁(JVM提供的):当前执行的线程ID+支持偏向锁标记的epoch+分代年龄age+偏向锁标志+锁状态JVM源码关于MarkWord的说明//markWord.hpp //32bits,32bit的MarkWord存储信息如下: //hash:25bit--------------->|age:4bitbiased_lock:1bitlock:2bit(norm

  • 图的深度遍历和广度遍历

    理论部分图的深度遍历和广度遍历都不算很难像极了二叉树的前序遍历和层序遍历,如下面的图,可以用右边的邻接矩阵进行表示,假设以顶点0开始对整幅图进行遍历的话,两种遍历方式的思想如下:1.深度优先遍历(depthFirstSearch—DFS)由初始顶点开始,沿着一条道一直走,当走到走不动的时候,再回来走一条可以走的通的道,然后再继续往下走,直到走不动,再回来…对应于本图来说就是从0开始往前走,到1----->然后从1再往前走,到5----->从5再往前走,到4------->到了这里发现没路可走了------>就往回走,回到5,看5还有没有路,发现没路----->则回到1,看1有没有路,也没有----->再回到0,看0有没有路,发现有------>则由0走到3----->走到这里发现又没有路了----->再往回走,走到0,看0还有没有路,发现有----->则由0走到4,但是4已经被遍历过了,所以再回到0,结束这次遍历过程但是这时候还有一个2没有遍历啊,该怎么办呢?之前我们是直接就默认从0开始进行往下遍历了,但是从0开始遍历没有一条

  • 看图说话:持久式XSS(跨站)漏洞示例

    ★安全测试之XSS漏洞★读书与实践是获取知识的主要渠道,学习的权力只掌握在每个人自己手中,让学习成为一种生活的习惯,这比任何名牌大学的校徽重要得多!——张老师张老师寄语 目录1XSS(跨站)漏洞是什么?2.如何判断是否存在持久型XSS攻击风险?3.持久型XSS攻击的危害?4.怎么防止持久型XSS攻击呢?1.XSS(跨站)漏洞是什么?XSS是跨站脚本攻击(CrossSiteScripting)的简称,细心的同学可能发现了,英文缩写应该是"CSS”,但为什么不简称CSS呢,这是为了跟跟层叠样式表(CascadingStyleSheets,CSS)进行区别。我们做界面测试时,常常在“输入框”中输入一些特殊字符、或者超长字符串来验证这个输入框是否做了数据格式校验或者边界值处理。我们也都知道,如果没有进行必要的格式验证或者边界值处理,就会影响用户体验。但不妨再深入思考一下,输入框中的数据若不作处理,除了“易用性”的问题,是否有更严重的情况呢?答案是肯定的。如果我们查看一个网页的源代码,我们会发现这个页面大都是html语言,html语言的一个典型特点是它的内容包含在一个个“标签”中,比如

  • 英特尔CPU又曝新漏洞,AMD或也遭殃

    【新智元导读】英特尔处理器又曝新漏洞,攻击者能从CPU的内部处理过程中获取加密数据。研究人员怀疑AMD的产品或许也未能幸免。研究人员再次发现英特尔CPU的一项漏洞,这个代号“PortSmash”的问题能够从并行的CPU或内存中泄露保密数据,AMD产品也被怀疑存在同样的漏洞。PortSmash由芬兰坦佩雷理工大学和古巴哈瓦那技术大学的5名研究人员发现。他们将PortSmash归类为“旁路攻击”(side-channelattack),这是一种从计算机内存或CPU中获取加密数据的攻击。攻击者通过记录和分析操作时间、功耗、电磁泄漏甚至声音的差异来得到相关信息,而这些信息可能有助于破坏计算机的加密算法并恢复CPU的处理数据。研究人员表示,PortSmash会影响使用同时多线程(SMT)架构的所有CPU,SMT技术允许在CPU核心上同时执行多个计算线程。简单说,攻击的原理是就在在使用SMT并行线程运行功能的合法的处理器旁边运行一个恶意进程。这个恶意PortSmash进程会导致处理器泄露少量数据,从而帮助攻击者重建该处理器在合法进程内处理的加密数据。研究人员表示,他们已经确认PortSma

  • 使用R语言分析微信好友

    上篇使用python分析微信好友-简书 https://www.jianshu.com/p/c7f1b400d20a python爬虫: 数据保存后用R语言作图分析 省份分布 城市分布 微信签名生存词云

  • spark开发基础之Scala详解apply方法

    问题导读 1.什么情况下调用apply方法? 2.apply你认为有哪些作用? 3.方法调用属于apply什么功能? apply网上很多资料,但是总感觉总讲的不是很透彻。这里自己总结下:包括摘录及个人经验,希望可以加深大家的理解 什么情况下会调用apply方法 当遇到下面表达式时,apply方法会被调用:Object(参数1,参数2。。。。参数N) 通常这样一个方法返回的是伴生对象。 举例来说:Array对象定义了apply,我们可以用下面形式来数组 Array("about”,"yun","com") 为什么不使用构造器?对于嵌套式表达式而言,省去new关键字方便很多,例如 Array(Array("about","yun"),Array("www","com")) 我们比较容易搞混 Array("about","yun")与newArray("about","yun&q

  • 网络监听

    网络监听 被动监听采用广播机制的IEEE802.3以太网,使网卡处于混杂模式接收局域网内所有arp数据包检测方法:构造一个排查目标的的IP和一个错误的MAC地址的ICMP(echorequest)数据包,如果收到应答,则说明目标网卡处于混杂模式。 主动监听现在更多以太网使用交换机,给某个特定主机的数据包被交换机从特定的端口送出,而不是使用广播的形式。 终端ARP缓存投毒,即主动嗅探/中间人攻击;检测方法:1.发送一个ARP广播包,这样ARP缓存表中便包括了所有在线的主机IP到MAC地址的映射,随后再发送一个非广播ARP,接着查看当前ARP缓存表,检查两表是否一致,若有异常则说明存在监听。 交换机DoS,强制交换机进入Hub模式:广播;检测方法:使用网络抓包进行分析,关注丢包率和重传率,以及未知的MAC地址。且处理大量大量网络包会导致机器性能下降。可通过性能(icmpechodelay等方法)加一判断。 交换机投毒,主动“污染”交换机的MAC-Port转发表,即CAM表。检测方法:观察交换机CAM表中异常更新记录,是由一个MAC地址反复被更改到不同端口。另外,由于大部分的网络监听软件

  • centos7 静态路由配置

    背景:双网卡主机,一个口为公网,一个口为内网,需要通过指定默认路由,随时进行内、外网切换。 显示路由表:iprouteshow|column-t 修改静态路由:   修改永久静态路由:需要重启网络服务  

  • haproxy??

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。 HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。 包括GitHub、Bitbucket、StackOverflow、Reddit、Tumblr、Twitter和Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。   &n

  • 2019 CCPC-江西省赛(填坑中)

    Cotree 题意: 由N个点构成两棵树,问在两颗树之间连接一条边之后,各点之间距离和的最小值为多少 题解:  进行两次DFS找到两颗树的重心,将两个重心连接起来,再进行一次DFS求出距离和即可 #include<iostream> #include<map> #include<vector> #include<queue> #include<string> #include<set> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<map> #include<set> #include<list> #include<deque> #include<queue> #include<stack> #include<cstdlib> #include<cst

  • 给最后一个li增加样式

    用Jquery来写:复制 $(".rec3li:last").css("margin-right","0px");复制  说明:   1、$(".rec3li:last")选择器下的最后一个元素   2、增加样式  

  • vscode——如何在vscode中运行C/C++

    前言 mingw-w64:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 内容 安装mingw-w64 下载地址 x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z:x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z 腾讯微云:https://share.weiyun.com/bw9w0SjF 配置环境 ?>下载后进行解压后并配置系统环境变量 测试 ?>打开cmd窗口,输入gcc-v测试 安装插件 C/C++ C/C++:C/C++ CodeRunner CodeRunner:CodeRunner 配置插件 测试 学无止境,谦卑而行.

  • c++ 面向对象程序设计

    1.OOP:概述 2.定义基类和派生类 3.虚函数 4.抽象基类 5.访问控制与继承 6.继承中的类作用域 7.构造函数与拷贝控制 8.容器与继承

  • orcal期末复习总结

    物理存储结构   数据库的物理存储结构主要包括3个类物理文件:数据文件,控制文件,重做日志文件;   其他文件:归档日志文件,参数文件,密码文件; 相关命令   sqlplus/assysdba ;  登入超管   alteruserscottaccountunlock ; 解锁scott用户   grantusername toxx; 给用户授权   showuser;  查看当前用户   disc; --disconnect 退出当前用户   help ; 查看帮助命令   / or  run; 运行缓冲池命令   star D:\xxx.sql;   运行指定路径的命令   get  D:\xxx.sql ;  将外部文件导入缓冲区   alteruserscottidentifiedbypwd;  &n

  • python切换窗体driver.switch_to.window

    # #点击查询,获取句柄 wbselect=driver.window_handles #driver.switch_to_window(wbselect[1])      python3.5之后不能用此写法 driver.switch_to.window(wbselect[1])    改成这种 sleep(3) wbselect=driver.find_element_by_name('ctl00$btn1') wbselect.click() sleep(3)   运行报错 DeprecationWarning:usedriver.switch_to.windowinstead   对策: #driver.switch_to_window(wbselect[1])      python3.5之后不能用此写法 driver.switch_to.window(wbselect[1]) 

  • 如何预防SQL注入,XSS漏洞(spring,java)

    SQL注入简介 SQL注入是由于程序员对用户输入的参数没有做好校验,让不法分子钻了SQL的空子, 比如:我们一个登录界面,要求用户输入用户名和密码: 用户名:'or1=1-- 密码: 点击登录之后,如果后台只有一条简单的待条件的sql语句,没有做特殊处理的话: 如: Stringsql="select*fromuserswhereusername='"+userName+"'andpassword='"+password+"'" 这样拼接的结果是 Stringsql="select*fromuserswhereusername='’or1=1--'andpassword=''" 这条语句会将数据库中的数据全部读出来。 很显然由于username='’or1=1中用户名等于''或1=1这个条件恒成立,然后后面加上了--,然后后面的语句不起作用。所以就把数据库中的数据全部读取出来了。 如果:执行 select*fromuserswhereusername='';DROPDatabase(DBName)--'andpassword='' 则会产生很严重的后果。 怎样预防SQL注入 预防SQL

  • SpringMVC Jsp include 错误404 不显示页面

    一、问题描述:  1.新建了taglibs.jsp存放jstl标签库和jsp建站基本变量ctx和basPath如下 (位置WEB-INF\common) <%@pageimport="java.math.*"%> <%@pageimport="java.util.*"%> <%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%> <%@tagliburi="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%> <%@tagliburi="http://java.sun.com/jsp/jstl/functions"prefix="fn"%> <%@tagliburi="http://www.springframework.org/tags"prefix="spring"%> <%@tagliburi="http://www.springframework.org/tags/form

  • windows下用cordova构建android app

    最近用到cordova打包apk,总结了下,写下来给大家分享。 一、前期准备工作: 1、安装node  6.2.0*64 下载地址:链接:http://pan.baidu.com/s/1eS7TsHW密码:8gfo   2、配置android环境 javajdk和androidsdk的下载地址: javajdk 版本:jdk-8u91-windows-x64   version1.8.0_b14 链接:http://pan.baidu.com/s/1hs5hy7q密码:cay9 androidsdk 版本:adt-bundle-windows-x86_64-20131030 链接:http://pan.baidu.com/s/1hsQMdQc密码:okoc   3、java和android环境变量的配置 java环境变量配置方法:http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html android环境变量配置: http://jingyan.ba

  • jquery ajax跨域回调

    $.ajax({ type:"GET", url:"http://110.188.70.244:8090/idp/restful/getIDPToken", dataType:'jsonp', data:{ appId:'xxhxm', remoteIp:'127.0.0.1' }, jsonp:'jsonpCallback', jsonpCallback:'successCallback', success:function(response){ console.log(response); }, error:function(jqXHR,textStatus,errorThrown){ console.log(jqXHR); console.log(textStatus); console.log(errorThrown); } }); functionsuccessCallback(r){ console.log(222) } 或者 functiongetdata(r){ console.log(222) } $.ajax({ type:'GET', url:"http:/

相关推荐

推荐阅读