AttributeError: 'NoneType' object has no attribute 'get_text'

目标:为了找一些好看的电影,爬取猫眼电影排行榜前100的电影信息,看大家的选择是否适合自己

工具:pycharm

第三方库:requests,bs4

代码思路:

  1. 模拟浏览器请求,得到网页源码
  2. 通过解析库获取需要的标签信息
  3. 将得到的信息以文本形式保存下来
import requests
from bs4 import BeautifulSoup
import json

def get_page(url):
    try:
        headers={
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
        }
        res=requests.get(url,headers=headers)
        if res.status_code == 200:
            return res.text
        else:
            return None
    except Exception:
        print('请求失败,请重试')
        return None
def get_info(html):
    #获取电影的排名,电影名,主演,评分,上映时间
    soup=BeautifulSoup(html,'html.parser')
    tables=soup.select('dd')
    #print(tables)
    try:
        for tabel in tables:
            rank=tabel.find(name='i',class_='board-index board-index-1').get_text()
            name=tabel.find(name='p',class_='name').get_text()
            star=tabel.find(name='p',class_='star').get_text().strip()[3:]
            score=tabel.find(name='p',class_='score').get_text()
            time=tabel.find(name='p',class_='releasetime').get_text().strip()[5:]

            yield {
                '排名': rank,
                '电影名': name,
                '主演': star,
                '评分': score,
                '上映时间': time
            }
    except  Exception as e:
        print(e)

def save_info(text):
    with open('maoyan_info.txt','a',encoding='utf-8')as f:
        f.write(json.dumps(text,,ensure_ascii=False)+'\n')

if __name__ == '__main__':
    for i in [n*10 for num in range(11)]:
        url='https://maoyan.com/board/4?offset='+str(i)
        html=get_page(url)
        for item in get_info(html):
            print(item)
            save_info(item)
    print('successful!')

运行后报错:AttributeError: 'NoneType' object has no attribute 'get_text',查看代码和网页源代码后发现是

rank=tabel.find(name='i',class_='board-index board-index-1').get_text() 这一行出错了,每一个元素的 board-index-1中的数字代表排名,也就是说这个是代表排名第一的元素,爬取排名第二的电影就会找不到该元素,所以报错。将它改为rank=tabel.find(name='i',class_='board-index').get_text()即可。

小伙伴也可以根据需要将这些信息保存到数据库,供以后数据分析做数据源。

 

 

你可能感兴趣的:(python,爬虫)