将字典中包含不同长度列表的字典转换为pandas DataFrame

时间:2018-02-15 07:21:12

标签: python pandas dictionary web-scraping beautifulsoup

我通过调用关于电影的OMDB API来检索JSON。我试图将JSON添加到另一个从here抓取信息的字典。

具有抓取信息的Dict具有以下结构:

{
         'movie_title': [],
         'review_text': [],
         'review_url': [],
         'reviewed_by': [],
         'score': []
}

我通过循环来自OMDB API的响应,动态地将键添加到字典中,将值作为空列表,如下所示

api_key = ''
ombd_data = requests.get('http://www.omdbapi.com/?apikey=api_key'+'&t=Basmati+Blues&plot=full'
omdb_json = json.loads(omdb_data).content
for curr_key in omdb_json.keys():
    movie_review_dict[curr_key] = []

dict现在有结构

{
     u'Actors': [],
     u'Awards': [],
     u'BoxOffice': [],
     u'Country': [],
     u'DVD': [],
     u'Director': [],
     u'Genre': [],
     u'Language': [],
     u'Metascore': [],
     u'Plot': [],
     u'Poster': [],
     u'Production': [],
     u'Rated': [],
     u'Ratings': [],
     u'Released': [],
     u'Response': [],
     u'Runtime': [],
     u'Title': [],
     u'Type': [],
     u'Website': [],
     u'Writer': [],
     u'Year': [],
     u'imdbID': [],
     u'imdbRating': [],
     u'imdbVotes': [],
     'movie_title': [],
     'review_text': [],
     'review_url': [],
     'reviewed_by': [],
     'score': []
}

我有一个读取此URL的函数,使用BeautifulSoup模块并向dict添加元素。我也同时在OMBD响应中添加数据。

def read_html_page(home_page='http://www.rogerebert.com/reviews'):
    movie_details = movie_review_dict
    result = requests.get(url=home_page)
    soup_obj = BeautifulSoup(result_content, 'html5lib')
    wrapper_class = soup_obj.find('div', id='review-list')
    for curr_movie_dom in wrapper_class.find_all('figure'):
        movie_title = curr_movie_dom.find('h5', class_='title').a.get_text()
        movie_critic = curr_movie_dom.find('p', class_='byline').get_text().strip()  
        omdb_dict = get_omdb_data(movie_title=movie_title)
        for curr_key in omdb_dict.keys():
            if curr_key in movie_details:
                movie_details[curr_key].append(omdb_dict[curr_key])
            else:
                movie_details[curr_key] = []
                movie_details[curr_key].append(omdb_dict[curr_key])
    return movie_details

我试图将dict存储到pandas DataFrame中,但我收到了错误

ValueError('arrays must all be same length')

这是因为OMDB响应中的一些属性,如语言'网站'某些电影存在,而不是其他电影。

我已经尝试了

movie_df = pd.DataFrame(movie_review_dict)
movie_df = pd.DataFrame.from_dict(movie_details)

我遇到了同样的错误。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用answer

附加到空数据框
df = pd.DataFrame()
df = df.append(movie_review_dict, ignore_index=False)