存储多维列表?

时间:2018-01-12 23:38:29

标签: python arrays json

(以下代码)

我正在抓取一个网站,我回来的数据是2个多维数组。我希望所有内容都是JSON格式,因为我想保存它并在以后添加"标记"时再次加载它。

所以,不那么模糊。我正在编写一个程序,它接收的数据就像你拥有的字符和要求你做的任务一样(如果属性对齐,你可以一次完成多个),然后根据每个字符的属性列表进行检查履行并返回上下文中最佳字符的排序列表。

现在我只是抓取角色数据,但我已经"得到了#34;每个字符的属性数据 - 问题是它没有按名称排序,因此它只是一个我需要能够查找的随机重复列表。我仍然没有想出如何做到这一点。

现在我有2个数组,1个用于表的标题,1个用于表的行。这些行包含"答案"对于标题"问题" /"标题" ;即最高等级,50 除了第一个条目,即姓名,发音(我只想存储课程名称)之外的所有内容都是如此。

所以:

Iterations = 0
While loop based on RowArray length / 9 (While Iterations <= that)
HeaderArray[0] gives me the name
RowArray[Iterations + 1] gives me data type 2
RowArray[Iterations + 2] gives me data type 3
Repeat until Array[Iterations + 8]
Iterations +=9

所以我经历并将这些附加到单独的列表中 - 单个数组,如CharName []和CharMaxLevel []等等。

但我真的不确定这是否会让这更容易?因为我的最终目标是发送&#34; CharacterName&#34;并根据这个回收东西并且能够发送&#34; DesiredTraits&#34;并获得符合该特质的#34; CharacterNames&#34;背部。这意味着我还需要弄清楚如何半效地存储该类别数据。有超过80种可能的类别,大多数只适用于10种。我不知道我将如何存储或加载这些数据。

我认为JSON是最好的方法吗?我出于性能和代码可读性的原因尝试将其全部保存在一个文件中 - 不希望每个字符都有一个文件。

代码:(原谅我,我之前从来没有抓过任何东西+我实际上对Python有点新鲜 - 只是在4天前得到它)

https://pastebin.com/yh3Z535h

^如果有人想要运行这个,这样可以更容易地获取原始代码(:

import time
import requests, bs4, re
from urllib.parse import urljoin
import json
import os

target_dir = r"D:\00Coding\Js\WebScraper" #Yes, I do know that storing this in my Javascript folder is filthy
fullname = os.path.join(target_dir,'TsumData.txt')

StartURL = 'http://disneytsumtsum.wikia.com/wiki/Skill_Upgrade_Chart'
URLPrefix = 'http://disneytsumtsum.wikia.com'

def make_soup(url):
    r = requests.get(url)
    soup = bs4.BeautifulSoup(r.text, 'lxml')
    return soup

def get_links(url):
    soup = make_soup(url)
    a_tags = soup.find_all('a', href=re.compile(r"^/wiki/"))
    links = [urljoin(URLPrefix, a['href'])for a in a_tags]  # convert relative url to absolute url
    return links

def get_tds(link):


    soup = make_soup(link)
    #tds = soup.find_all('li',  class_="category normal") #This will give me the attributes / tags of each character
    tds = soup.find_all('table',  class_="wikia-infobox")
    RowArray = []
    HeaderArray = []

    if tds: 
        for td in tds:
            #print(td.text.strip()) #This is everything

            rows = td.findChildren('tr')#[0]
            headers = td.findChildren('th')#[0]


        for row in rows:
            cells = row.findChildren('td')
            for cell in cells:
                cell_content = cell.getText()
                clean_content = re.sub( '\s+', ' ', cell_content).strip()
                if clean_content:
                    RowArray.append(clean_content)


        for row in rows:
            cells = row.findChildren('th')
            for cell in cells:
                cell_content = cell.getText()
                clean_content = re.sub( '\s+', ' ', cell_content).strip()
                if clean_content:
                    HeaderArray.append(clean_content)

        print(HeaderArray)
        print(RowArray)
    return(RowArray, HeaderArray)

    #Output = json.dumps([dict(zip(RowArray, row_2)) for row_2 in HeaderArray], indent=1)
    #print(json.dumps([dict(zip(RowArray, row_2)) for row_2 in HeaderArray], indent=1))
    #TempFile = open(fullname, 'w') #Read only, Write Only, Append 
    #TempFile.write("EHLLO")
    #TempFile.close()


            #print(td.tbody.Series)
            #print(td.tbody[Series])
            #print(td.tbody["Series"])
            #print(td.data-name)
            #time.sleep(1)

if __name__ == '__main__':
    links = get_links(StartURL)
    MainHeaderArray = []
    MainRowArray = []
    MaxIterations = 60
    Iterations = 0
    for link in links: #Specifically I'll need to return and append the arrays here because they're being cleared repeatedly.
        #print("Getting tds calling")
        if Iterations > 38: #There are this many webpages it'll first look at that don't have the data I need
            TempRA, TempHA = get_tds(link)
            MainHeaderArray.append(TempHA)
            MainRowArray.append(TempRA)
        MaxIterations -= 1
        Iterations += 1
        #print(MaxIterations)
        if MaxIterations <= 0: #I don't want to scrape the entire website for a prototype
            break

    #print("This is the end ??")
    #time.sleep(3)
    #jsonized = map(lambda item: {'Name':item[0], 'Series':item[1]}, zip())
    print(MainHeaderArray)
    #time.sleep(2.5)
    #print(MainRowArray)
    #time.sleep(2.5)
    #print(zip())
    TsumName = []
    TsumSeries = []
    TsumBoxType = []
    TsumSkillDescription = []
    TsumFullCharge = []
    TsumMinScore = []
    TsumScoreIncreasePerLevel = []
    TsumMaxScore = []
    TsumFullUpgrade = []
    Iterations = 0
    MaxIterations = len(MainRowArray)
    while Iterations <= MaxIterations: #This will fire 1 time per Tsum
        print(Iterations)
        print(MainHeaderArray[Iterations][0]) #Holy this gives us Mickey ;
        print(MainHeaderArray[Iterations+1][0])
        print(MainHeaderArray[Iterations+2][0])
        print(MainHeaderArray[Iterations+3][0])
        TsumName.append(MainHeaderArray[Iterations][0])
        print(MainRowArray[Iterations][1])
        #At this point it will, of course, crash - that's because I only just realized I needed to append AND I just realized that everything
        #Isn't stored in a list as I thought, but rather a multi-dimensional array (as you can see below I didn't know this)
        TsumSeries[Iterations] = MainRowArray[Iterations+1] 
        TsumBoxType[Iterations] = MainRowArray[Iterations+2]
        TsumSkillDescription[Iterations] = MainRowArray[Iterations+3]
        TsumFullCharge[Iterations] = MainRowArray[Iterations+4]
        TsumMinScore[Iterations] = MainRowArray[Iterations+5]
        TsumScoreIncreasePerLevel[Iterations] = MainRowArray[Iterations+6]
        TsumMaxScore[Iterations] = MainRowArray[Iterations+7]
        TsumFullUpgrade[Iterations] = MainRowArray[Iterations+8]
        Iterations += 9
        print(Iterations)
    print("It's Over")
    time.sleep(3)
    print(TsumName)
    print(TsumSkillDescription)

编辑: 我的目标就是这样 &#34;对于这张任务卡我需要一个具有高分潜力的蓝色Tsum,一个Monster's Inc Tsum用于一系列游戏,以及一个男性Tsum用于长链......什么是最好的Tsum鉴于那些?&#34;并且它会像&#34; SULLY!&#34;并自动选择它或至少给你一个Tsums列表。喜欢&#34;这些匹配所有这些,这些匹配2,这些匹配1&#34;

编辑2: 这是上面代码的命令行输出: https://pastebin.com/vpRsX8ni

编辑3:好的,刚刚回来休息一下。看到一些小调,我看到发生了什么 - 我的附加代码说&#34;将此列表附加到数组&#34;意思是我有一个列表,列出了我存储的Header和Row数组。所以我可以(至少对自己)确认这些不是嵌套列表本身,但它们肯定是2个列表,每个列表在每个条目包含一个列表。绝对不是字典或任何东西&#34;特殊情况&#34;至少。这应该可以帮助我快速找到一个答案,因为我不会抛出多维列表&#34;围绕我的谷歌搜索或想知道为什么列表的东西不起作用(因为它期望1值并获得列表)。

编辑4: 我需要简单地添加另一个列表!但超级嵌套。 它只是将Tsum所拥有的类别存储为字符串。 so Array [10] = ArrayOfCategories [Tsum](包含Tsum所具有的字符串形式的每个属性) 因此,即TsumArray [10] = [&#34; Black&#34;,&#34; White Gloves&#34;,&#34; Mickey&amp;朋友&#34;] 然后我就可以使用&#34; Switch&#34;我已经制作了以便检查它们。有可能。感觉不太好,但还没到那么远。

1 个答案:

答案 0 :(得分:0)

只需将打开的文件用作json_file,写/读(超级简单)。

最终存储了3个json文件。没什么大不了。比附加到一个大文件容易得多。