在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ python網(wǎng)頁爬取時(shí),將數(shù)據(jù)保存到字典是發(fā)生數(shù)組越界怎么解決

python網(wǎng)頁爬取時(shí),將數(shù)據(jù)保存到字典是發(fā)生數(shù)組越界怎么解決

數(shù)組越界解決不了,請各位指教,直接上代碼,這是跟著視頻敲的,但是我的就是有問題,在線等答案

import re
import requests
from bs4 import BeautifulSoup
import sys
def getHtmlPage(url):
    try:
        r=requests.get(url, timeout=10)
        r.raise_for_status()
        r.encoding=r.apparent_encoding 
        return r.text
    except:
        s = sys.exc_info()
        print(("Error '%s' happened on line %d")% (s[1],s[2].tb_lineno))
def getID(id, url):
    html=getHtmlPage(url)
    soup=BeautifulSoup(html,"html.parser")
    a=soup.find_all("a")
    for i in a:
        try:
            # i.attrs 是字典類型,屬性名是鍵,屬性值是值,但是 attrs 使用時(shí)出錯(cuò),直接用 get 獲得屬性值
            h = i.get("href")
                     
            f = re.compile(r"[s][zh]\d{6}")
            b = f.findall(h)           
            c = re.findall(r"[0-9]\d{5}", str(b)) # 得到 ['900923'] 前面的 sh 標(biāo)識是哪個(gè)股市的
            if b != []:
                id.append(b)
        except:
            s = sys.exc_info()
            print(s[1], s[2].tb_lineno)
            print("lalalalallala")
def getInfo(id, htmlurl, fpath):
    count = 1
    for i in id:
        url = htmlurl + "".join(i) + ".html" # 一定要將列表轉(zhuǎn)換為字符串
        html = getHtmlPage(url)
        try:
            infodict = {}
            soup = BeautifulSoup(html, "html.parser")
            stockInfo = soup.find("div", attrs={"class": "stock-bets"}) # 最外層 div
            
            # 這里得到的是一個(gè) tag 對象集所以要取第一個(gè)值
            stockname = soup.find_all("a", attrs={"class": "bets-name"})[0]
            
            infodict.update({"股票名稱": stockname.text.split()[0]})#        
            keylist = stockInfo.find_all("dt")
            valuelist = stockInfo.find_all("dd")            
            for i in range(len(valuelist)):
                infodict[keylist[i].text] = valuelist[i].text # 存入字典,數(shù)組越界在這里!
            with open(fpath, "a", encoding="utf-8") as f:
                f.write(str(infodict) + '\n')
                count = count + 1 # 只爬取20個(gè)頁面的,太多了電腦遭不住
            if count > 20:
                break
        except:
            s = sys.exc_info()
            print(s[1],s[2].tb_lineno)
            continue   
def main():
    baiduURl = "https://gupiao.baidu.com/stock/"
    dongfangURl = "http://quote.eastmoney.com/stocklist.html"
    fpath = "F:/la.txt"
    id = []
    getID(id, dongfangURl)
    getInfo(id, baiduURl, fpath)
    print("lalal")
    
main()

錯(cuò)誤提示信息clipboard.png

所得到的文本結(jié)果
clipboard.png

回答
編輯回答
浪婳

錯(cuò)誤定位在45行:

infodict.update({"股票名稱": stockname.text.split()[0]})#    

應(yīng)該是某些股票名稱為空造成的。

調(diào)試時(shí),不要用try...except把錯(cuò)誤信息都屏蔽了,在關(guān)鍵的地方打上斷點(diǎn)或者print出值看看。

2018年7月3日 18:56