เสี่ยวเหลียงจุ๊บ 2021-12-19 01:23 采纳率: 100%
浏览 104
已结题

爬虫代码写好了 运行 报错 怎么解决(语言-python|开发工具-pycharm)

问题遇到的现象和发生背景

img

img

问题相关代码,请勿粘贴截图

# coding=gbk
import requests
from bs4 import BeautifulSoup
import os
import urllib.request

headers = {'user-agent': 'Mozilla/5.0'}
root_url = 'http://www.shuomingshuku.com/file/'
def getall():
    mkdir("D:\\Python爬取的文件\\")
    for i in range(1, 200, 1):
        _file = getHtml(i)
        getFile(_file)
def getHtml(page_id):
    testurl = str(root_url) + str(page_id)
    res = requests.get(testurl, headers=headers)
    res.encoding = "utf-8"
    soup = BeautifulSoup(res.text, "html.parser")
    element_h1 = soup.find_all("h1")
    element_a = soup.find_all("a", attrs={"class": "btn", "rel": "nofollow"})
    file_name = element_h1[0].next
    file_url = element_a[0].attrs['href']
    return [file_name, file_url]
def getFile(files):
    file_name = files[0]
    u = urllib.request.urlopen(files[1])
    f = open("D:\\Python爬取的文件\\" + file_name + ".pdf", 'wb')
    block_sz = 8192
    while True:
        buffer = u.read(block_sz)
        if not buffer:
            break

        f.write(buffer)
    f.close()
    print("成功-下载文件:" + file_name)
def mkdir(path):
    path = path.strip()
    path = path.rstrip("\\")
    isExists = os.path.exists(path)
    if not isExists:
        os.makedirs(path)
        return True
    else:
        return False
if __name__ == "__main__":
    getall()

运行结果及报错内容

img

"I:\Program Files\Python\python.exe" "I:/Program Files/Python/xuexi/xuexi02.py"
Traceback (most recent call last):
  File "I:\Program Files\Python\xuexi\xuexi02.py", line 47, in <module>
    getall()
  File "I:\Program Files\Python\xuexi\xuexi02.py", line 12, in getall
    _file = getHtml(i)
  File "I:\Program Files\Python\xuexi\xuexi02.py", line 22, in getHtml
    file_url = element_a[0].attrs['href']
IndexError: list index out of range

我想要达到的结果

img

  • 写回答

2条回答 默认 最新

  • 二当家的白帽子 后端领域优质创作者 2021-12-19 12:12
    关注

    把404排除掉的逻辑,你忘记加了,望采纳

    
    # coding=gbk
    import requests
    from bs4 import BeautifulSoup
    import os
    import urllib.request
    
    headers = {'user-agent': 'Mozilla/5.0'}
    root_url = 'http://www.shuomingshuku.com/file/'
    
    
    def getall():
        mkdir("D:\\Python爬取的文件\\")
        for i in range(1, 200, 1):
            _file = getHtml(i)
            if _file:
                getFile(_file)
    
    
    def getHtml(page_id):
        testurl = str(root_url) + str(page_id)
        res = requests.get(testurl, headers=headers)
        if res.status_code == 404:
            print("\n当前page_id:" + str(page_id) + " 返回404")
            return None
        res.encoding = "utf-8"
        soup = BeautifulSoup(res.text, "html.parser")
        element_h1 = soup.find_all("h1")
        element_a = soup.find_all("a", attrs={"class": "btn", "rel": "nofollow"})
        file_name = element_h1[0].next
        file_url = element_a[0].attrs['href']
        return [file_name, file_url]
    
    
    def getFile(files):
        file_name = files[0]
        u = urllib.request.urlopen(files[1])
        f = open("D:\\Python爬取的文件\\" + file_name + ".pdf", 'wb')
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break
            f.write(buffer)
        f.close()
        print("成功-下载文件:" + file_name)
    
    
    def mkdir(path):
        path = path.strip()
        path = path.rstrip("\\")
        isExists = os.path.exists(path)
        if not isExists:
            os.makedirs(path)
            return True
        else:
            return False
    
    
    if __name__ == "__main__":
        getall()
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 创建了问题 12月19日

悬赏问题

  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥200 求能开发抖音自动回复卡片的软件
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。