Очистка и сохранение нескольких элементов в список в одной функции - PullRequest
1 голос
/ 12 июля 2020

Я пытаюсь создать аккуратный массив, в котором хранятся следующие пары ключ-значение:

  1. cafename: "очищенное имя"
  2. cafeaddress: "очищенный адрес"
  3. cafedescription: "scrapped description"

Я написал код, который может очищать каждый из этих элементов при запуске как отдельные функции (таким образом, один элемент очищается для каждой функции = 3 функции). Но теперь я пытаюсь уменьшить количество повторений, используя одну функцию, которая очищает все 3 элемента, а затем добавляет их в список.

Прямо сейчас, когда я пытаюсь использовать приведенный ниже код, он просто возвращает описание, которое - последний элемент в строке cafes_container = soup_cafes.findAll(attrs={"class": "venue-title", "class": "address-content", "class": "venue-description"}) скрипта.

Весь блок кода выглядит следующим образом:

def cafes():
    url = 'https://www.broadsheet.com.au/melbourne/guides/best-cafes-thornbury'
    response = requests.get(url, timeout=5)

    soup_cafes = BeautifulSoup(response.content, "html.parser")
    type(soup_cafes)

    cafes_container = soup_cafes.findAll(attrs={"class": "venue-title", "class": "address-content", "class": "venue-description"})
    
    cafes = []
    for container in cafes_container:
        cafes.append(container.text)

    return(cafes)

1 Ответ

1 голос
/ 12 июля 2020

Словарь {"class":"venue-title", "class":"address-content", "class":"venue-description"} эквивалентен {"class":"venue-description"}. Это не должно вызывать удивления, учитывая, что весь смысл словаря состоит в том, чтобы иметь уникальные ключи. Каждое буквальное определение просто перезаписывает предыдущее значение. И на самом деле вы наблюдали именно это поведение.

Вы можете использовать это в своих интересах, снова и снова задавая значение в словаре:

cafe_classes = ["venue-title", "address-content", "venue-description"]

cafes = []
for cafe_class in cafe_classes:
    cafes.append(soup_cafes.find(attrs={"class": cafe_class}).text)

На этом этапе понимание может быть проще читать и писать:

cafe_classes = ["venue-title", "address-content", "venue-description"]
cafes = [soup_cafes.find(attrs={"class": c}).text for c in cafe_classes]
...