【问题标题】:Issue with Selenium, BS and pandas "ValueError: All arrays must be of the same length"Selenium、BS 和 pandas 的问题“ValueError:所有数组必须具有相同的长度”
【发布时间】:2022-01-08 14:19:38
【问题描述】:

我在编码方面完全是个菜鸟,但目前正在研究一些东西,只是为了在 python 中玩耍 - 这真的很酷!

如果我想抓取的网站上没有某些部分数据(例如价格),您能帮我找出如何避免“ValueError:所有数组必须具有相同长度”的方法吗?我可以看到数据无法通过 print(len) 获得 - 例如,数据帧的 len 为 10、11、11,这会导致错误,因为第一个缺少行值。其他一切都很好。对我来说,如果缺少的行可以简单地用“-”或“不可用”之类的东西来填充,那就太酷了。

我尝试了很多阅读,并且经历了很多尝试和错误,因此,如果有人可以帮助我,我会非常高兴。这是我的代码:

    #add parser
    page_source = driver.page_source
    soup = BeautifulSoup(driver.page_source, 'html.parser')
            
    #add scrape info
    images = []
    for img in soup.findAll('div', {'class': 'gridContent'}):
        images.append(img.get('src'))
        marke  = [marke.text for marke in soup.findAll('span', {'class': 'ZZZ'})]
        titel  = [titel.text for titel in soup.findAll('h3', {'class': 'YYY'})]
        preis  = [preis.text for preis in soup.findAll('div', {'class': 'XXX'})]
                          
        #assign DF's
        alle_daten = {'Zeitstempel:': timestamp_human, 'URL:': url, 'Marke:': marke, 'Titel:': titel, 'Preis:': preis}
                              
        df_all = pd.DataFrame(data=alle_daten) 
                      
        df_scrape_all_clean = df_all.replace('\n', ' ',)
        clean_stack = pd.concat([df_scrape_all_clean], axis=1)
        df_all_urls = df_all_urls.append(df_all)
                       
    df_all_urls.to_excel("AAA.xlsx")
    print(url)

【问题讨论】:

  • 这是代码不断崩溃的部分:#assign DF's alle_daten = {'Zeitstempel:': timestamp_human, 'URL:': url, 'Marke:': marke, 'Titel:':标题,'Preis:':preis}
  • 您可以检查价格是否为无,并在价格不可用时附加N/A。
  • @KamaleshS:你能向我解释一下这是怎么可能的吗?这将 - 至少我猜是这样 - 解决了我的问题。谢谢!
  • 如果您可以分享网址,我可以更好地帮助您。

标签: python pandas selenium beautifulsoup web-crawler


【解决方案1】:

我会给你一个案例研究的例子,以了解为什么会出现这个错误以及将来如何避免它。

假设我们尝试创建以下 pandas DataFrame:

import pandas as pd

#define arrays to use as columns in DataFrame
team = ['A', 'A', 'A', 'A', 'B', 'B', 'B']
position = ['G', 'G', 'F', 'F', 'G', 'G', 'F', 'F']
points = [5, 7, 7, 9, 12, 9, 9, 4]

#attempt to create DataFrame from arrays
df = pd.DataFrame({'team': team,
                   'position': position,
                   'points': points})

result:

ValueError: All arrays must be of the same length

我们收到一个错误,告诉我们每个数组的长度不同。

我们可以通过打印每个数组的长度来验证这一点:

#print length of each array
print(len(team), len(position), len(points))

result:

7 8 8

我们看到'team'数组只有7个元素,而'position'和'points'数组各有8个元素。

如何修复错误

解决此错误的最简单方法是确保我们使用的每个数组具有相同的长度:

import pandas as pd

#define arrays to use as columns in DataFrame
team = ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B']
position = ['G', 'G', 'F', 'F', 'G', 'G', 'F', 'F']
points = [5, 7, 7, 9, 12, 9, 9, 4]

#create DataFrame from arrays
df = pd.DataFrame({'team': team,
                   'position': position,
                   'points': points})

#view DataFrame
df

    team    position points
0   A   G    5
1   A   G    7
2   A   F    7
3   A   F    9
4   B   G    12
5   B   G    9
6   B   F    9
7   B   F    4

注意这次每个数组的长度都是一样的。

因此,当我们使用数组创建 pandas DataFrame 时,我们不会收到错误,因为每一列的长度相同。

【讨论】:

  • 感谢@Zakaria Ferzazi 的精彩回复。但这里的问题是,我没有手动创建数据框数据,而是从网站上抓取它。因此,我不能简单地添加“多一个价值”。我需要在创建数据框时自动添加“不可用”或类似的东西,以防缺少值。你明白我的意思吗?
  • 我明白你亲爱的,听试试这个:alle_daten = pd.DataFrame({'Zeitstempel:': timestamp_human, 'URL:': url, 'Marke:': marke, 'Titel:': titel, 'Preis:': preis}) df_all_urls= pd.ExcelWriter('AAA.xlsx') df_all.to_excel(writer) df_all_urls.save()
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多