Словарь возвращает пустое значение;но он все еще хранится в списке - PullRequest
0 голосов
/ 19 декабря 2018

Итак, у меня есть метод, который извлекает данные, используя BeautifulSoup;он может хранить и добавлять данные, собранные из словаря;однако, когда я пытаюсь распечатать список, чтобы проверить данные;возвращается как

Пусто {}

Пример кода

main_link = 'Sample Link'
def_list = []
def_dict = {}

def retrieve_from(ml):
#some code

scrap_data = retrieve_from(main_links)

def MethodA(className, url_link):
    try:
        for div_tag in url_link.find_all('div'):
            div_text = div_tag.find('div', {'class': className})
            if div_text :
                def_dict = {
                    'Description': div_text.text.replace("\n", "")}
                def_list.append(def_dict )
        return def_dict 
    except:
        def_dict = None

У метода нет проблем с извлечением данных, поскольку он печатается в списке;когда я печатаю def_list в команде:

 {'Description': 'a'},
 {'Description': 'b'},
 {'Description': 'c'}

Я пытался ссылаться на следующее;но чтобы помочь, это не решило проблему, с которой я столкнулся.

Я пытался

my_dict = list(def_dict.keys())
pprint(my_dict) 

, но все еще возвращает {}, я указываю на неопределенный список?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Попробуйте вернуть список вместо словаря?

def MethodA(className, url_link):
   try:
        for div_tag in url_link.find_all('div'):
             div_text = div_tag.find('div', {'class': className})
             if div_text :
                def_dict['Description'] =  div_text.text.replace("\n", "")
                def_list.append(def_dict )
        return def_list #instead of def_dict?
   except:
        def_dict = None
0 голосов
/ 20 декабря 2018

jasonharper в комментариях прав насчет проблемы, и LearningNoob в основном имеет правильное решение (с незначительными изменениями), но я решил, что стоит опубликовать, чтобы предоставить полную картину.

def_list являетсясписок определен во внешней области и предназначен для хранения def_dict словарей.def_dict определено прямо под ним: неясно, для чего это нужно немедленно, но внутри MethodA мы можем видеть, что def_dict представляется контейнером с ключом Description со значением, основанным натекст в <div> элементах определенного класса.

В MethodA мы используем серию методов, чтобы найти <div>, которые соответствуют определенным критериям.Когда мы находим его, мы создаем новый def_dict:

def_dict = {'Description': div_text.text.replace("\n", "")}

Поскольку мы присваиваем переменной def_dict во внутренней области видимости, этот новый объект (инициализируется с помощью {}) фактически имеет приоритет над def_dict, определенным во внешней области: в памяти есть два экземпляра словаря - во внешней области, начальный пустой экземпляр словаря по-прежнему назначается def_dict, находясь во внутренней области def_dict теперь ссылается на словарь {'Description': div_text.text.replace("\n", "")}.

Этот второй экземпляр, следовательно, добавляется к def_list.Поскольку def_list не было назначено во внутренней области, это все тот же экземпляр списка, который мы инициализировали во внешней области.

Когда мы возвращаемся во внешнюю область, мы обнаруживаем, что ссылки на def_list и def_dict никогда не менялись в этих областях, однако def_list по-прежнему содержит ссылки на все def_list экземпляры, которые мы создали в MethodA.Поэтому def_list печатает список def_dict s, инициализированных, когда мы запускали MethodA, и def_dict печатает пустой (потому что ничего к нему не было добавлено).

Насколько я знаюМожно сказать, нет смысла определять, какое def_dict (из бесконечного числа def_dicts, которое MethodA может инициализировать) должно указываться ссылкой во внешней области видимости, поэтому я 'Я не уверен, почему важно, чтобы def_dict возвращал пустое значение или возвращал произвольный элемент def_list.


Принимая во внимание причину, по которой решение LearningNoob возвращает None, скорее всего,эти строки прямо здесь:

def MethodA(className, url_link):
    try:
        for div_tag in url_link.find_all('div'):
            [etc]
        return def_dict
    except:
        def_dict = None

Во время итерации MethodA for div_tag in url_link: в какой-то момент это, вероятно, дает сбой.Когда это происходит, вызывается предложение except и неявно возвращается None.Поэтому, если вы выполните одно из следующих действий:

def_list = MethodA(*args,**kw)
## or
print(MethodA(*args,**kw))

Результат будет None.

0 голосов
/ 19 декабря 2018

Попробуйте это

main_link = 'Sample Link'
def_list = []
def_dict = {}

def retrieve_from(ml):
#some code

scrap_data = retrieve_from(main_links)

def MethodA(className, url_link):
   try:
        for div_tag in url_link.find_all('div'):
             div_text = div_tag.find('div', {'class': className})
             if div_text :
                def_dict['Description'] =  div_text.text.replace("\n", "")
                def_list.append(def_dict )
        return def_dict 
   except:
        def_dict = None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...