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

#python #dictionary

#python #словарь

Вопрос:

В настоящее время я нахожусь в процессе создания веб-сканера с использованием requests and BeautifulSoup . Я использую цикл for для создания списка словарей со значениями, являющимися href a тегами. Однако у меня возникают проблемы с этим, поскольку все результаты будут последними href на этой странице. Вот результат, когда я распечатываю конечный результат:

 [{'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}, {'link': '/terms'}]
 

Я не уверен, почему он выполняет только последнее значение. Я предполагаю, что это потому, что в последнем цикле он присваивает этому значению все ключи с одинаковым именем. Как я могу это исправить? Вот код.

 import json
import requests
from bs4 import BeautifulSoup

tags_dict = {}
tags_list = []

r = requests.get("http://chicosadventures.com/")

soup = BeautifulSoup(r.content, "lxml")


for link in soup.find_all('a'):
    tags_dict['link'] = link.get('href')
    tags_list.append(tags_dict)

dump = json.dumps(tags_list)
print(dump)
 

Ответ №1:

Ваша проблема в tags_dict том, что. Вы просто снова и снова сохраняете ссылку на этот словарь в своем списке, и, поскольку это ссылка, последнее значение отражается во всех записях. Я изменил его, чтобы создать новый объект dict для каждой итерации, теперь он работает нормально

 import json
import requests
from bs4 import BeautifulSoup

tags_list = []
r = requests.get("http://chicosadventures.com/")
soup = BeautifulSoup(r.content, "lxml")

for link in soup.find_all('a'):
    tags_list.append({"link": link.get('href')})

dump = json.dumps(tags_list)
print(dump)
 

Вывод:

[{«ссылка»: «/»}, {«ссылка»: «/about_chico»}, {«ссылка»: «/about_the_author»}, {«ссылка»: «/about_the_illustrator»}, {«ссылка»: «/chico_in_the_news_»}, { «ссылка»: «/order_your_copy»}, {«link»: «/contact_us»}, {«link»: «/about_chico»}, {«link»: «/about_the_author»}, {«link»: «/about_the_illustrator»}, {«link»: «/chico_in_the_news_»}, {«link»: «/order_your_copy»}, {«link»: «/contact_us»}, {«link»: «/privacy»}, {«link»: «javascript:print()»}, {«link»: «http://www.ebtech.net /«}, {«ссылка»: «/условия»}]