huashishuai89 2022-04-06 15:49 采纳率: 83.3%
浏览 44
已结题

为什么出现list index out of range

想要爬取164页每页10条新闻,并把爬取到的信息存到exel文档。
一开始没补充getdata方法中的内容,只打印datalist可以输出

问题相关代码
from bs4 import BeautifulSoup #网页解析,获取数据
import urllib.request,urllib.error
import  re
import xlwt

def main():
    baseurl="https://www.dailynews.lk/search/node/China%20%20COVID-19?page=0"
    datalist=getData(baseurl)
    savepath="BBC中国疫情.xls"
    saveData(datalist,savepath)
    #askURL("https://www.dailynews.lk/search/node/China%20%20COVID-19?page=")
    getData()

#新闻详情链接的规则
findLink=re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串的模式)r表示忽视特殊符号
#新闻时间
findDate=re.compile(r'<p class="search-info"><span about="/users/.*" class="username" datatype="" property="foaf:name" typeof="sioc:UserAccount" xml:lang="">.*</span> - (.*?) - .*</p>')

#爬取网页
def getData(baseurl):
    datalist=[]
    for i in range(0,164):
        url=baseurl+str(i*10)
        html=askURL(url)#保存获取的网页源码
        #逐一解析
        soup=BeautifulSoup(html,"html.parser")
        for item in soup.find_all("li",class_="search-result"): #查找符合要求的字符串,形成列表
            #print(item)
            data=[]#保存一条新闻的信息
            item= str(item)
            #获取新闻详情链接
            link=re.findall(findLink,item)[0]
            data.append(link)
            #新闻日期
            date=re.findall(findDate,item)[0]
            date=re.sub('-',' ',date) #替换“-”
            data.append(date)

            datalist.append(data) #把信息放入datalist

    return datalist



#得到指定url的网页内容
def askURL(url):
    #模拟头部信息
    head={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.46"}
    #用户代理(告诉浏览器可以接受什么水平的文件内容)

    request=urllib.request.Request(url,headers=head)
    html=""
    try:
        respose=urllib.request.urlopen(request)
        html=respose.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html



#保存数据
def saveData(datalist,savepath):
    news = xlwt.Workbook(encoding="utf-8")  # 创建book对象
    sheet = news.add_sheet('BBC中国疫情')  # 创建工作表
    col = ("新闻详情链接", "新闻发布日期")
    for i in range(0, 2):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, 1640):
        print("第%d条" % i)
        data = datalist[i]
        for j in range(0, 2):
            sheet.write(i + 1, j, data[j])
    news.save(savepath)  # save
    


if __name__ == '__main__':
    main()






运行结果及报错内容

结果没有exel文档生成

img

  • 写回答

1条回答 默认 最新

  • ~白+黑 Python领域新星创作者 2022-04-06 18:39
    关注
    for i in range(0, 1640):越界了for i in range(len(datalist))吧
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 已采纳回答 4月6日
  • 修改了问题 4月6日
  • 修改了问题 4月6日
  • 展开全部

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么