4Manuals

  • PDF Cloud HOME

从Python中的函数返回多个字典 Download

    如何将文本边界框与pyplot.Rectangle对齐? 导入类问题 在Python数据框中选择列时出错 使用Rabbit的pika确认消息 如何在按住键的同时暂停VideoStream? Python OpenCV TypeError:无法处理此数据类型 使用buildozer不会下载sdl2_image Golang服务器无法从远程REST API获取所有JSON SMTPSenderRefused,421,超出超时 Tensorflow多线程推理比单线程推理慢

我试图了解如何从一个函数返回几个字典。如果我在函数本身中打印出 data_dict ,我会得到五个字典。如果将从函数返回data_dict,将其存储在变量中,然后打印出来,则仅显示最后一个字典。如何将所有五个字典归还?

import requests
from bs4 import BeautifulSoup
import re
import json

source = requests.get('https://www.tripadvisor.ch/Hotel_Review-g188113-d228146-Reviews-Coronado_Hotel-Zurich.html#REVIEWS').text

soup = BeautifulSoup(source, 'lxml')

pattern = re.compile(r'window.__WEB_CONTEXT__={pageManifest:(\{.*\})};')
script = soup.find("script", text=pattern)
dictData = pattern.search(script.text).group(1)
jsonData = json.loads(dictData)


def get_reviews():

    data_dict = {}
    for locations in jsonData['urqlCache']['669061039']['data']['locations']:
        for data in locations['reviewListPage']['reviews']:
            data_dict['reviewid'] = data['id']
            data_dict['authoridtripadvisor'] = data['userId']
            userProfile = data['userProfile']
            data_dict['author'] = userProfile['displayName']    
            print(data_dict)
    #return data_dict

reviews = get_reviews()
print(reviews)

感谢您的所有建议!

2 个答案:

答案 0 :(得分:3)

您的问题是,在data_dict中您只能保留一部词典。

您必须为所有字典创建列表

all_dictionaries = []

和append()到此列表的每个字典

all_dictionaries.append(data_dict)

和return此列表

return all_dictionaries

在for循环中,您必须为新数据创建新字典。您不能使用一个data_dict来替换此词典中的元素。


def get_reviews():

    all_dictionaries = []

    for locations in jsonData['urqlCache']['669061039']['data']['locations']:
        for data in locations['reviewListPage']['reviews']:

            data_dict = {}

            data_dict['reviewid'] = data['id']
            data_dict['authoridtripadvisor'] = data['userId']
            userProfile = data['userProfile']
            data_dict['author'] = userProfile['displayName']    
            print(data_dict)

            all_dictionaries.append(data_dict)

    return all_dictionaries

答案 1 :(得分:1)

编辑:看到@Furas的答案,但几乎是同一回事(在点击“提交”之前没有看到其他答案)

如果您知道要提前返回的字典数,则可以像这样返回它们:

def get_reviews():
    # ...
    return dict1, dict2, dict3

然后使用如下结果:

d1, d2, d3 = get_reviews()

但是如果您想返回任意数量的结果,则应该返回包含所有字典的列表:

import requests
from bs4 import BeautifulSoup
import re
import json

source = requests.get('https://www.tripadvisor.ch/Hotel_Review-g188113-d228146-Reviews-Coronado_Hotel-Zurich.html#REVIEWS').text

soup = BeautifulSoup(source, 'lxml')

pattern = re.compile(r'window.__WEB_CONTEXT__={pageManifest:(\{.*\})};')
script = soup.find("script", text=pattern)
dictData = pattern.search(script.text).group(1)
jsonData = json.loads(dictData)


def get_reviews():
    data = []
    for locations in jsonData['urqlCache']['669061039']['data']['locations']:
        for data in locations['reviewListPage']['reviews']:
            data.append({
                'reviewid': data['id'],
                'authoridtripadvisor': data['userId'],
                'author': data['userProfile']['displayName'] 
            })

    return data

reviews = get_reviews()
print(reviews)



Similar searches
    如何在Kotlin中从片段移动到另一个片段 错误:`style`属性需要从样式属性到值而不是字符串的映射 是否可以创建多个线程并使每个线程进入睡眠状态? ng生成时超出了呼叫重试异常 如何在bootstrap4中的flexbox包装的项目之间增加垂直间距?