解决python爬虫时遇到AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘

最近在练习学到的爬虫实例遇到AttributeError: ‘NoneType’ object has no attribute 'find_all’的错误。

爬虫要求如下:

任务描述:https://movie.douban.com/cinema/later/beijing/ 这个页面描述了北京最近上映的电影,你能否通过 Python 得到这些电影的名称、上映时间和海报呢?这个页面的海报是缩小版的,我希望你能从具体的电影描述页面中抓取到海报。

在运行老师给的代码如下:

import requests
from bs4 import BeautifulSoup

def main():
    url = "https://movie.douban.com/cinema/later/beijing/"
    init_page = requests.get(url).content
    init_soup = BeautifulSoup(init_page, 'lxml') 

    all_movies = init_soup.find('div', id="showing-soon")
    for each_movie in all_movies.find_all('div', class_="item"):
        all_a_tag = each_movie.find_all('a')
        all_li_tag = each_movie.find_all('li')

        movie_name = all_a_tag[1].text
        url_to_fetch = all_a_tag[1]['href']
        movie_date = all_li_tag[0].text

        response_item = requests.get(url_to_fetch).content
        soup_item = BeautifulSoup(response_item, 'lxml')
        img_tag = soup_item.find('img')

        print('{} {} {}'.format(movie_name, movie_date, img_tag['src']))

main()

出现错误:NoneType object has no attribute ‘find_all’
在这里插入图片描述
看一下需要爬取的数据和源码:

在这里插入图片描述在这里插入图片描述
发现都没有错,然后打印出现NoneType的地方:
在这里插入图片描述
结果显示:

<class 'NoneType'>

经过查阅资料发现:出现这种问题就是,获取不到数据。原因就是该网站被爬太多次,我们被该网页服务器的反爬虫程序发现了,并禁止我们爬取。因此我们需要模拟浏览器,重新给服务器发送请求,并且添加头等信息headers,headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 。

下面大致看一下设置header的原因和用法。

为什么要设置header?

在请求网页爬取的时候,输出的text信息中会出现抱歉,无法访问等字眼,这就是禁止爬取,需要通过反爬机制去解决这个问题。

headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。

对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 。

headers在哪里找?

谷歌或者火狐浏览器,在网页面上点击:右键–>检查–>剩余按照图中显示操作,需要按Fn+F5刷新出网页来

有的浏览器是点击:右键->查看元素,刷新

在这里插入图片描述注意:headers中有很多内容,主要常用的就是user-agent 和 host,他们是以键对的形式展现出来,如果user-agent 以字典键对形式作为headers的内容,就可以反爬成功,就不需要其他键对;否则,需要加入headers下的更多键对形式。

你可以找你的浏览器的header,我这里直接给出一个header运行

header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
    init_page = requests.get(url, headers=header).content

把header参数加入到获取信息requests里面。

继续运行程序:出现TypeError: ‘NoneType’ object is not subscriptable
在这里插入图片描述
又是NoneType的问题,解决方法一样。打印NoneType,然后还是加入header信息。

解决问题后,最后爬取结果如下:

通往春天的列车 0917日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2620365836.jpg
麦路人 0917日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2619912723.jpg
死无对证 0918日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2620256769.jpg
邻里美好的一天 0918日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2620261010.jpg
萌宠流浪记 0918日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2620364842.jpg
蓝色防线 0918日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2617621409.jpg
红巴山 0918日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2617808060.jpg
世纪之缘 0922日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2617650682.jpg
菊次郎的夏天 0925日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2620392435.jpg
夺冠 0925日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2620083313.jpg
急先锋 0930日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2619027144.jpg
姜子牙 1001日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2617446867.jpg
我和我的家乡 1001日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2616128001.jpg
一点就到家 1001日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2619723175.jpg
奇妙王国之魔法奇缘 1001日 https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2614907771.jpg
木兰:横空出世 1003日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2616737564.jpg
月半爱丽丝 1030日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2619823575.jpg
日不落酒店 1212日 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2619899048.jpg
小美人鱼的奇幻冒险 1212日 https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2614997193.jpg
拆弹专家2 1224日 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2614798555.jpg

Process finished with exit code 0

参考
《Python核心技术与实战》
《Python——爬虫【Requests设置请求头Headers】》https://blog.csdn.net/ysblogs/article/details/88530124
《AttributeError: ‘NoneType’ object has no attribute ‘find_all’(添加请求头信息)》

  • 41
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: 这个错误是由于当Python尝试在一个NoneType对象上调用find_all方法发生的。这通常是因为代码中尝试对一个未定义的对象或变量使用find_all方法。 最常见的情况是在网络爬虫代码中。当爬虫没有找到要查找的内容,通常会返回一个NoneType对象,而不是一个包含内容的对象。在这种情况下,如果尝试对返回的NoneType对象使用find_all方法,则会出现上述错误。 要解决这个问题,可以在使用find_all方法之前添加一个条件语句,以确保对象不为NoneType。例如,可以使用if语句检查返回的对象是否为空,如果为空则不执行find_all方法。另一种方法是使用try和except语句,以处理可能出现的AttributeError错误。 总之,在处理find_all方法的结果,确保对象已经被定义并正确返回,否则将会看到这个错误消息。 ### 回答2: AttributeErrorPython中常见的错误,意思是无法找到对象的某个属性或方法。当我们在代码中使用一个空值(即NoneType对象)调用某个方法,就会出现“AttributeError: 'NoneType' object has no attribute 'XXX'”的错误提示。 例如,我们在使用BeautifulSoup库,需要对HTML文本进行解析,可以使用find_all方法来查找指定标签的内容。如果我们没有正确指定标签名称或者HTML文本为空值,就有可能会遇到AttributeError: 'NoneType' object has no attribute 'find_all'”的错误。 为解决这个问题,我们需要仔细检查代码中是否存在空值情况。如果存在,可以通过添加判断条件并进行错误处理来避免出现AttributeError异常。例如,我们可以使用try...except语句来捕获异常并输出错误信息: ```python try: # 解析HTML文本 soup = BeautifulSoup(html_text, 'html.parser') # 查找指定标签的内容 content = soup.find_all('div', class_='content') except AttributeError as e: print(f"Error: {str(e)}") ``` 这样,即使html_text为空值,我们也可以避免出现AttributeError异常,并输出相应的错误信息。 综上所述,AttributeError: 'NoneType' object has no attribute 'find_all'这个错误提示是Python中常见的错误,通常是因为对象为空值导致的。我们可以通过添加判断条件和错误处理来避免出现该异常,保证代码的稳定性和可靠性。 ### 回答3: AttributeErrorPython中最常见的错误之一,它表示某个对象没有某个属性或方法。在这种情况下,它指的是对象为NoneType,而在NoneType上没有find_all属性。 在解决此错误的过程中,最重要的是要弄清楚为什么会出现NoneType对象。通常是因为代码中的某个变量没有被正确初始化或赋值,或者该变量在运行被赋予了None值。 接下来,我们需要看一下代码中具体出现这个错误的地方。这通常涉及到使用BeautifulSoup库或其他类似库的方法来解析HTML或其他文本数据。如果我们使用.find_all()方法在一个NoneType对象上,就会出现这个错误。 解决这个问题的方法有很多。首先,我们可以检查我们的代码中是否有未初始化或没有正确赋值的变量。其次,我们可以使用条件语句或try-except语句来检查是否出现了NoneType对象,并在代码中进行相应的处理。最重要的是,我们需要仔细检查我们使用的所有库和方法的文档,以确保我们的参数和输入是正确的。 总的来说,遇到这种错误,我们需要彻底检查我们的代码,查找任何未赋值的变量,并仔细阅读所使用的库和方法的文档,以确保正确的输入和参数。一旦我们找到错误,我们就可以采取相应的措施来解决它,使我们的代码顺畅运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值