找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3855|回复: 3

[求助] 代码显示out of range , 这里的range指的究竟是什么?

2

主题

5

帖子

5

积分

贫民

积分
5
蟒蛇咬人好痛 发表于 2017-7-26 19:45:02 | 显示全部楼层 |阅读模式
完全是小白,想要依据下图的代码作为模板,练练手爬去其他网站的信息 url = “http://yz.chsi.com.cn/zsml/queryAction.do

我依据的代码(代码一):

代码一:#CrawUnivRankingB.py
import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[3].string])

def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u=ulist
        print(tplt.format(u[0],u[1],u[2],chr(12288)))
   
def main():
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 10) # 20 univs
main()

接下来是我自己依据上面代码修改的(代码二):代码二:import requests
from bs4 import BeautifulSoup
import bs4
def GetHtmlTxt(url):
    try:
        r = requests.get(url , timeout = 30 )
        r.raise_for_status()
        r.recoding = r.apparent_encoding
        return r.text
    except:
        return ""


def FillList(Slist , html):
    soup = BeautifulSoup( html , "html.parser")
    for tr in soup.find("tbody").descendants:
        if isinstance(tr ,bs4.element.Tag ):
            tds = tr("td")
            Slist.append([tds[0].string , tds[1].string , tds[2].string , tds[3].string , tds[4].string , tds[5].string ])




def OutPutList(Slist , num):
    print("{:^10}\t{:^6}\t{:^10}\t{:3^}\t{:3^}\t{:3^}".format("招生大学","所在地址","学校特性","研究生院","计划","Doctor"))
    for i in range (num):
        u = Slist
        print("{:^10}\t{:^6}\t{:^10}\t{:3^}\t{:3^}\t{:3^}".format(u[0],u[1],u[2],u[3],u[4],u[5]))

def main():
    unifo = []
    url = "http://yz.chsi.com.cn/zsml/queryAction.do"
    html = GetHtmlTxt(url)
    FillList(unifo , html)
    OutPutList(unifo , 11 )
main()


代码二运行报错,错误内容为:Traceback (most recent call last):  File "C:/Users/2233/Desktop/广东省研究生照收大学(医学).py", line 36, in <module>    main()  File "C:/Users/2233/Desktop/广东省研究生照收大学(医学).py", line 34, in main    FillList(unifo , html)  File "C:/Users/2233/Desktop/广东省研究生照收大学(医学).py", line 19, in FillList    Slist.append([tds[0].string , tds[1].string , tds[2].string , tds[3].string , tds[4].string , tds[5].string ])IndexError: list index out of range

请问要怎么修啊各位老大。

152201dop6jtji5yjbb21j.png (118.17 KB, 下载次数: 0)

图片是在某个同样的帖子上下过来的



回复

使用道具 举报

2

主题

5

帖子

5

积分

贫民

积分
5
蟒蛇咬人好痛  楼主| 发表于 2017-7-26 19:50:13 | 显示全部楼层
这里还有一个问题,源代码中的:
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u=ulist
        print(tplt.format(u[0],u[1],u[2],chr(12288)))
这一个部分并不理解,其中的format是什么作用。请教一下各位。就算是推荐我去看什么书都行。

还有:def fillUnivList(ulist, html):中的
ulist.append([tds[0].string, tds[1].string, tds[3].string])这一部分也不是很明白。

谢谢各位
回复 支持 反对

使用道具 举报

5

主题

101

帖子

101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
101

最佳新人活跃会员热心会员突出贡献

QQ
落叶秋风 发表于 2017-8-4 23:51:12 | 显示全部楼层
index out of range就是下标超限界了,比如我有个a[10]的列表,我使用a[11]就会报这个错误,另外format是格式化函数,具体使用方法请自行查阅官方文档或者看这个http://www.runoob.com/python/att-string-format.html,比我解释的更清楚。ulist.append([tds[0].string, tds[1].string, tds[3].string])的意思是往ulist列表尾部塞入[tds[0].string, tds[1].string, tds[3].string]这样一个数据项。这个是一些python基础,你可以上菜鸟教程翻看下Python的基础知识,看懂那些再看这些你就全懂了。
回复 支持 反对

使用道具 举报

1

主题

14

帖子

14

积分

贫民

积分
14
lywane 发表于 2017-8-14 10:33:55 | 显示全部楼层
format是字符串格式化函数,比用+号做字符串连接强多了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表