菜菜要努力丫 2024-02-12 21:03 采纳率: 0%
浏览 13

关于#python#的问题:想问一下爬虫出现list index out of range怎么解决?

想问一下爬虫出现list index out of range怎么解决?li标签中有空值

报错如下

img

原始界面中有广告,使得中间存在空值

img


爬取的数据类型如下:

img

代码如下


import requests
import selector as selector
from lxml import etree
import re
url='https://cs.58.com/chuzu/'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58'
}

page_text=requests.get(url=url, headers=headers).text
tree=etree.HTML(page_text)
li_list=tree.xpath('//ul[@class="house-list"]/li')
fp=open('58.txt','w',encoding='utf-8')
i=0
for li in li_list:
            title=li.xpath('./div[2]/h2/a/text()')[0]
            print(title)
            fp.write(title+' ')
            room_type=li.xpath('./div[2]/p[@class="room"]/text()')[0]
            fp.write(room_type + ' ')
            print(room_type)
            # location1 = li.xpath('./div[2]/p[@class="room"]/text()')[0]
            location1 = li.xpath('./div[2]/p[@class="infor"]/a/text()')[0]
            fp.write(location1 + ' ')
            print(location1)
            location2 = li.xpath('./div[2]/p[@class="infor"]/a/text()')[1]
            fp.write(location2 + ' ')
            print(location2)
            position = li.xpath('./div[2]/p[@class="infor"]/text()')[0]
            fp.write(position + ' ')
            print(position)
            money = li.xpath('./div[3]/div[2]/b[@class="strongbox"]/text()')[0]
            fp.write(money + ' ')
            print(money)
            buy = li.xpath('./div[3]/div[2]/text()')[0]
            fp.write(buy + '\n')
            print(buy)
            i=i+1
            print(i)




  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-02-12 21:05
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    问题分析:

    报错信息显示是“list index out of range”,这通常是由于尝试访问列表中不存在的索引位置导致的。在你的代码中,这个错误可能是由于以下几个地方引起的:

    1. 在提取网页内容时,某些标签可能不存在,导致XPath表达式无法匹配到任何元素,进而尝试访问空列表的索引位置。
    2. 网页内容结构可能不是每个 li 标签都包含完整的信息,例如部分 li 标签中缺少某些元素,但你的代码尝试访问了这些不存在的元素。
    3. 在处理位置信息时,可能出现部分 li 标签中的位置信息与其他标签结构不一致,导致 XPath 表达式无法匹配到正确的元素,进而尝试访问空列表的索引位置。

    解决方案:

    1. 在提取 li 标签内容时,可以使用 try-except 语句捕获异常,避免程序因为某个 li 标签内容不完整而终止执行。
    2. 在提取每个字段内容时,先判断该字段是否存在,若不存在则赋予默认值或者跳过当前循环。
    3. 在处理位置信息时,可以针对不同的 li 标签结构编写不同的 XPath 表达式,以确保准确提取位置信息。

    下面是修改后的代码:

    import requests
    from lxml import etree
    
    url = 'https://cs.58.com/chuzu/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58'
    }
    
    page_text = requests.get(url=url, headers=headers).text
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//ul[@class="house-list"]/li')
    fp = open('58.txt', 'w', encoding='utf-8')
    
    for li in li_list:
        try:
            title = li.xpath('./div[2]/h2/a/text()')[0]
            room_type = li.xpath('./div[2]/p[@class="room"]/text()')[0]
            location1 = li.xpath('./div[2]/p[@class="infor"]/a/text()')[0]
            location2 = li.xpath('./div[2]/p[@class="infor"]/a/text()')[1]
            position = li.xpath('./div[2]/p[@class="infor"]/text()')[0].strip()  # 增加strip()去除空白字符
            money = li.xpath('./div[3]/div[2]/b[@class="strongbox"]/text()')[0]
            buy = li.xpath('./div[3]/div[2]/text()')[0]
            
            fp.write(f"{title} {room_type} {location1} {location2} {position} {money} {buy}\n")
        except IndexError:
            # 异常处理:索引超出范围时跳过当前循环
            continue
    
    fp.close()
    

    这样修改后的代码可以避免由于空值导致的索引超出范围的错误。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 修改了问题 2月12日
  • 创建了问题 2月12日

悬赏问题

  • ¥15 两条数据合并成一条数据
  • ¥15 Mac电脑安装了Charles,证书已经信任,电脑还是没网,找小伙伴帮看一下
  • ¥15 Ubuntu虚拟机设置
  • ¥15 comsol三维模型中磁场为什么没有“速度(洛伦兹项)”这一选项
  • ¥15 electron 如何实现自定义安装界面
  • ¥15 关于#linux#的问题:子进程C运行“ls –l”命令,且显示“C运行ls-l命令”(语言-c语言)
  • ¥15 vs code配置c语言遇到这个问题
  • ¥15 vscode调试编译找不到gcc,只有cl,但是检查cmd是对的,控制面板的路径也更改了
  • ¥20 access中怎么分割分别获取一下图中的值
  • ¥15 keras_tcn已经安装成功,还是显示ModuleNotFoundError: No module named 'keras_tcn'