「已注销」 2023-06-24 00:12 采纳率: 0%
浏览 17

为什么xpath提取内容的代码换一个位置行就报错:IndexError: list index out of range

原代码:

import requests
import time
from lxml import etree
import random
from datetime import datetime

# 请求头
headers = {'user-agent': ' '}
# 设置url
url = 'https://www.cbaigui.com/'
i = 1

while True:
    # 反馈信息
    response = requests.get(url, headers=headers)
    # 设置类型
    response.encoding = 'utf8'
    # 解析数据
    html = etree.HTML(response.text)
    # 提取名称列表、详情页面的url列表
    names = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//text()')
    # 去掉name列表中的空字符与换行符
    names = [i.strip() for i in names if i.strip()]
    # 详情页面的url列表
    detail_urls = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//@href')
    # 提取下一页url
    next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]
    # 遍历names,detail_url,获取页面url
    for name, detail_url in zip(names, detail_urls):
        # 反馈信息
        response = requests.get(detail_url, headers=headers)
        # 设置类型
        response.encoding = 'utf8'
        # 解析数据
        html = etree.HTML(response.text)
        # 提取描述内容
        description = html.xpath('//*[@id="page"]/div/div[1]/div[2]/article/div/p/text()')
        # 内容换行
        description = '\n'.join(description)
        # 写入文件
        with open(f'cbaigui{datetime.now().strftime("%Y%m%d")}.txt', 'a', encoding='utf8') as f:
            f.write(f'{i}{name}\n{description}\n\n')
            print(f'{i}{name} 抓取成功')
        i += 1
        # 休眠间隔
        time.sleep(random.randint(1, 3))
    url = next_url

提取下一页url 的代码在写入文件之前

    # 提取下一页url
    next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]

原代码存在 爬取最后一页时 运行到提取下一页url的代码会报错,导致最后一页无法写入文件
所以我想把提取下一页url放在写入文件之后,实现即使报错,最后一页也已经爬取完毕,如下:

import requests
import time
from lxml import etree
import random
from datetime import datetime

# 请求头
headers = {'user-agent': ' '}
# 设置url
url = 'https://www.cbaigui.com/'
i = 1

while True:
    # 反馈信息
    response = requests.get(url, headers=headers)
    # 设置类型
    response.encoding = 'utf8'
    # 解析数据
    html = etree.HTML(response.text)
    # 提取名称列表、详情页面的url列表
    names = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//text()')
    # 去掉name列表中的空字符与换行符
    names = [i.strip() for i in names if i.strip()]
    # 详情页面的url列表
    detail_urls = html.xpath('//*[@id="page"]/div/div[1]/div/article/div/h2//@href')
    # 遍历names,detail_url,获取页面url
    for name, detail_url in zip(names, detail_urls):
        # 反馈信息
        response = requests.get(detail_url, headers=headers)
        # 设置类型
        response.encoding = 'utf8'
        # 解析数据
        html = etree.HTML(response.text)
        # 提取描述内容
        description = html.xpath('//*[@id="page"]/div/div[1]/div[2]/article/div/p/text()')
        # 内容换行
        description = '\n'.join(description)
        # 写入文件
        with open(f'cbaigui{datetime.now().strftime("%Y%m%d")}.txt', 'a', encoding='utf8') as f:
            f.write(f'{i}{name}\n{description}\n\n')
            print(f'{i}{name} 抓取成功')
        i += 1
        # 休眠间隔
        time.sleep(random.randint(1, 3))
    # 提取下一页url
    next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]
    url = next_url

但是运行到 提取下一页url这一行就会报错:IndexError: list index out of range
IndexError: list index out of range通常有两种情况

一个可能是下标超出范围,
一个可能是list是空的,没有一个元素

但我调试不出具体原因

  • 写回答

2条回答 默认 最新

  • 梦幻精灵_cq 2023-06-24 06:34
    关注

      您已经找到问题“元凶”了。报错就是下标溢出,由引用不存在的下标引发。

    
    next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')[0]
    
    

      如果您 next_url == [] 时一定触发“下标溢出”错误。我这熟悉您的代码,因为我没学爬虫。😂您是不是可以用 string.join() 来获取列表中的字符串,这样子就不会因空列表而引发“下标溢出”报错了。

      您可以去除语句末尾的下标引用 [] ,用 ''.join() ,用空字符连接列表内的所有字符串元素——

    
    next_url = ''.join(html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href'))
    
    

    
    next_url = html.xpath('//*[@id="page"]/div/div[1]/div/nav/div/a[@class="page larger"][1]//@href')
    next_url = ''.join(next_url)
    

    试试看。


    评论

报告相同问题?

问题事件

  • 创建了问题 6月24日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境