创建锯齿数组时列表索引超出范围

2024-05-19 02:50:21 发布

您现在位置:Python中文网/ 问答频道 /正文

总之,我尝试在Python3.x中创建一个锯齿状列表。具体来说,我使用Selenium从网页列表中提取了许多元素。我的参差不齐列表(“矩阵”)的每一行都代表了上述网页的内容。这些行中的每一行都应该有与从其各自的网页中提取的元素一样多的列-这个数字会因页面而异。你知道吗

例如

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(),甚至在1D列表中使用这个。正如您在我的代码中看到的,我使用了.append()来表示hrefLinkArray成功,而在第64/65行,它似乎不成功。我不明白为什么会这样。你知道吗

请告诉我:

  1. 为什么我的行.append()[][]=...抛出这个错误。

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

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

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检索有关。。。不过,重要的是,我最初的问题得到了回答。谢谢!你知道吗


Tags: 代码inbrowser列表forgetrangeattribute
1条回答
网友
1楼 · 发布于 2024-05-19 02:50:21

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!

相关问题 更多 >

    热门问题