创建锯齿状数组

时间:2018-03-30 20:23:05

标签: python python-3.x list web-scraping jagged-arrays

全部,我正在尝试在Python 3.x中创建一个锯齿状列表。具体来说,我使用Selenium从网页列表中提取了许多元素。我的锯齿状列表的每一行("矩阵")代表这些所述网页之一的内容。这些行中的每一行都应该具有与从其各自的网页中拉出的元素一样多的列 - 该数字将随页面而变化。

e.g。

webpage1 has 3 elements: a,b,c
webpage2 has 6 elements: d,e,f,g,h,i
webpage3 has 4 elements: j,k,l,m
...

看起来像:

[[a,b,c],
[d,e,f,g,h,i],
[j,k,l,m],...]

到目前为止,这是我的代码:

from selenium import webdriver

chromePath = "/Users/me/Documents/2018/chromedriver"
browser = webdriver.Chrome(chromePath)

url = 'https://us.testcompany.com/eng-us/women/handbags/_/N-r4xtxc/to-1'
browser.get(url)

hrefLinkArray = []

hrefElements = browser.find_elements_by_class_name("product-item")

for eachOne in hrefElements:
    hrefLinkArray.append(eachOne.get_attribute('href'))

pics = [[]]

for y in range(0, len(hrefLinkArray)): # or type in "range(0, 1)" to debug
    browser.get(hrefLinkArray[y])
    productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li")
    b = -1
    for a in productViews:
        b = b + 1
        # print(y) for debugging
        # print(b) for debugging
        pics[y][b] = a.get_attribute('src') # <------------ ERROR!
        # pics[y][b].append(a.get_attribute('src') GIVES SAME ERROR AS ABOVE
    del productViews[:]

browser.quit()

每当我运行它时,我在a in productViews循环的第一次迭代时出现错误:

line 64, in <module>
    pics[y][b] = a.get_attribute('src')
IndexError: list assignment index out of range

据我所知,整数引用是正确的(请参阅for a in productViews循环中的调试行),因此pics[0][0]是引用锯齿状列表的正确方法。话虽这么说,我感觉pics[0][0]还不存在?或者只有pics[0]呢?我已经看过有关此错误的类似帖子,但我所理解的唯一解决方案似乎是使用.append(),即便如此,在一维列表中使用此解决方案。正如您在我的代码中看到的那样,我已经.append()成功使用了hrefLinkArray ,而在第64行看来不成功 65。我很难过为什么会这样。

请告诉我:

  1. 为什么我的专栏.append()[][]=...会抛出此错误。

  2. 如果有更有效的方法来实现我的目标,我想学习!

  3. 更新:使用@ User4343502的答案,结合@ StephenRauch的输入,错误已解决,我现在获得了预期大小的锯齿状列表!我修改的代码是:

    listOfLists = []
    
    for y in range(0, len(hrefLinkArray)):
        browser.get(hrefLinkArray[y])
    
        productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li")
        otherList = []
        for other in productViews:
            otherList.append(other.get_attribute('src'))
            # print(otherList)
        listOfLists.append(otherList)
        del otherList[:]
        del productViews[:]
    
    print(listOfLists)
    

    注意,此代码打印一个完全空索引的锯齿状列表,例如[[] [],[] [] [] [],[],[] [] [],[] [],[] [] [] [] [] ......],但这是一个单独的问题 - 我认为与productViews对象有关,以及xpath如何检索...但重要的是,我的原始问题已得到解答。谢谢!

1 个答案:

答案 0 :(得分:0)

list.append会将一个元素添加到列表中。无论元素是什么,这都有效。

a = [1, 2, 3]
b = [float, {}]
c = [[[None]]]

## We will append to this empty list
list_of_lists = []

for x in (a, b, c):
    list_of_lists.append(x)

## Prints: [[1, 2, 3], [<type 'float'>, {}], [[[None]]]]
print(list_of_lists)

Try it Online!