Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 591|回复: 0

嵩天老师python网课爬虫实例1的问题和解决方法

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-21 10:59:54 | 显示全部楼层 |阅读模式

    一,AttributeError: 'NoneType' object has no attribute 'children', 网页'tbody'没有子类

    很明显,报错的意思是说tbody下面没有children,说明我们在gethtmltext的时候可能出现了问题,可以用print(r.status.code)测试,发现并不是200,print(r.raise_for_status())返回的值也是None ,其次 gethtmltext返回的也是 error,说明我们并没有成功下载网页源码。错误原因猜测

    1,zuihaodaxue.com网站采取了反爬机制

    2,由于教程录制时间久远,url网址错误

    第一种情况,加上代理头和cookies测试,发现一样提示 AttributeError: 'NoneType' object has no attribute 'children' ,最后发现是我自己 r.text 写成了 r.txt

    def gethtmltext(url):
        headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"}
        cooks={"cookies":"Hm_lvt_2ce94714199fe618dcebb5872c6def14=1558142987; Hm_lpvt_2ce94714199fe618dcebb5872c6def14=1558147316"}
        try:
            r=requests.get(url,headers=headers,cookies=cooks,timeout=30)
            r.raise_for_status()
            r.encoding=r.apparent_encoding
            return r.text
        except:
            return "error"

    2,发现老师给的网址是zuihaodaxue.cn,现在网站更新变成了.com,所以换成 http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html 即可解决问题

    如果还存在问题那么大部分原因可能是单词拼写错误。

    以下为正确代码:

     1 def gethtmltext(url):
     2     try:
     3         r=requests.get(url,timeout=30)
     4         r.raise_for_status()
     5         r.encoding=r.apparent_encoding
     6         return r.text
     7     except:
     8         return "error"
     9 
    10 if __name__ == '__main__':
    11     url="http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html"

     

     

    二,format()函数格式错误——ValueError: Invalid format specifier

    以下代码错误:提示ValueError: Invalid format specifier

    1 def printunivlist(urlist,num):
    2     tplt = "{0:^6}\t{1:{3}^10}\t{2:^10}\t{3:^10}"
    3     print(tplt.format("排名","学校","地区","总分",chr(12288)))
    4     for i in range(num):
    5         u = urlist
    6         print(tplt.format(u[0],u[1],u[2],u[3],chr(12288)))

    以下代码正确:

    1 def printunivlist(urlist,num):
    2     tplt = "{0:^6}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
    3     print(tplt.format("排名","学校","地区","总分",chr(12288)))
    4     for i in range(num):
    5         u = urlist
    6         print(tplt.format(u[0],u[1],u[2],u[3],chr(12288)))

    可以看出,仅仅是1:{3}^10和1:{4}^10的差别。

     

    原因分析:

    第二行改为#这里添加了tplit = "{0:^10}\t{1:{3}^10}\t{2:^10}" ;{3:^10}”你添加了地区,相应的作为填充不足10个字符长度的chr(12288)已经不是3了,而是4。

    在这里很多同学肯定会问{1:{3}^10},填充为什么是填充3个或4个,为什么是在1号位填充:

    第一,中英文全半角造成不对齐的原因产生在1号位;

    第二,分析实例【Python爬取中国前20强大学】前20大学的结果,为排名、学校名称、总分,3个地方需填充,即为3;

    第三:后面加入省市,为排名、学校名称、总分、省市,4个地方需要填充,即为4;

    转载来源:https://blog.csdn.net/Andone_hsx/article/details/84025828

     

    最后贴上我的代码:

     1 import requests
     2 from bs4 import BeautifulSoup
     3 import bs4
     4 
     5 def gethtmltext(url):
     6     try:
     7         r=requests.get(url,timeout=30)
     8         r.raise_for_status()
     9         r.encoding=r.apparent_encoding
    10         return r.text
    11     except:
    12         return "error"
    13 
    14 def fillunivlist(urlist,html):
    15     soup = BeautifulSoup(html,"html.parser")
    16     for tr in soup.find("tbody").children:
    17         if isinstance(tr,bs4.element.Tag):
    18             tds = tr("td") #将所有标签存为一个列表
    19             urlist.append([tds[0].string,tds[1].string,tds[2].string,tds[4].string])
    20 
    21 
    22 
    23 def printunivlist(urlist,num):
    24     tplt = "{0:^6}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
    25     print(tplt.format("排名","学校","地区","总分",chr(12288)))
    26     for i in range(num):
    27         u = urlist
    28         print(tplt.format(u[0],u[1],u[2],u[3],chr(12288)))
    29 
    30 if __name__ == '__main__':
    31     unifo=[]
    32     url="http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html"
    33     html=gethtmltext(url)
    34     fillunivlist(unifo,html)
    35     printunivlist(unifo,20)

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 14:37 , Processed in 0.073044 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表