BeautifulSoup не находит все теги div - PullRequest
1 голос
/ 03 апреля 2020

Я запустил частный проект: просмотр веб-страниц с помощью Python и BeautifulSoup в коде Visual Studio (1.41.0).

Мне удалось очистить другой сайт с такой же структурой, что и у моей проблемы сайт». Однако теперь я столкнулся с тем, что BeautifulSoup не находит все теги div (их должно быть 20 на сайт, и я нахожу только 3 из них). Я сообщил себе о переполнении стека, но не нашел решения (или, очевидно, не понял его).

Веб-сайт: https://www.comparis.ch/gesundheit/arzt/pathologie

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

enter image description here

enter image description here

enter image description here

Я получаю все <div class="css-15dj4ut"></div> от <div class="css-fh99y9 excbu0j0">...</div>, но ни одного от <div class="css-roynbj excbu0j0"></div>. У вас есть идеи, почему?

В итерации по каждому URL, чтобы попасть на каждый сайт.

for i in range(0, endIndex):
try:
    if i == 0:
        urls.append(basicUrl)
        page = urllib.request.urlopen(urls[i])
        soup = BeautifulSoup(page, 'html.parser')

        getSurgeonName(soup)

    else:
        urls.append(basicUrl + urlAddon + str(i + 1))
        page = urllib.request.urlopen(urls[i])
        soup = BeautifulSoup(page, 'html.parser')

        getSurgeonName(soup)

except:
    print("An URL request error occured.")

Версия функции 1:

def getSurgeonName(soup):
    # gets just first 3 surgeons of site
    docName = re.compile('css-15dj4ut')
    docNameTags = soup.find_all('div', attrs={'class': docName})
    for a in docNameTags:
            docNameList.append(a.getText())

Версия функции 2:

def getSurgeonName(soup):

    parentClass = re.compile('css-fh99y9 excbu0j0')
    parentItems = soup.find_all('div', attrs={'class': parentClass})

    for parent in parentItems:
           children = parent.findChildren('div', {"class": "css-15dj4ut"}) 
           docNameList.append(children[0].getText())

    parentClass = re.compile('css-roynbj excbu0j0')
    parentItems = soup.find_all('div', attrs={'class': parentClass})

    for parent in parentItems:
           children = parent.findChildren('div', {'class': 'css-15dj4ut'}) 
           docNameList.append(children[0].getText())

1 Ответ

1 голос
/ 03 апреля 2020

На самом деле нужные вам desired данные загружаются через JavaScript, динамически загружаемую страницей, поэтому пакет requests не сможет визуализировать JavaScript на лету. Но я смог найти тег script, который содержит данные в string из JSON dict, а затем загрузил их в JSON.

Здесь вы можете проанализировать все, что вы хочу:).

import requests
from bs4 import BeautifulSoup
import json

r = requests.get("https://www.comparis.ch/gesundheit/arzt/pathologie")
soup = BeautifulSoup(r.content, 'html.parser')
script = soup.find("script", {'id': '__NEXT_DATA__'}).text

data = json.loads(script)

print(data.keys())  # JSON Dict

dumper = json.dumps(data, indent=4)

print(dumper)  # to see it in human readble format

Что-то вроде:

for item in data['props']['pageProps']['doctorResults']['doctorModels']:
    print(item['name'])

Вывод:

Mohamed Abdou
Dr. med. Heiner Adams
Dr. med. Franziska Aebersold
Prof. Dr. med. Adriano Aguzzi
Dr. med. Maria Ammann
Prosper Anani
Dr. med. Max Arnaboldi
Dr. med. Walter Arnold
Dr. med. Irena Baltisser
Dr. med. Fridolin Bannwart
Dr. med. Yara Banz
Dr. med. André Barghorn
Dr. Jessica Barizzi
Prof. Dr. med. Daniel Baumhoer
Audrey Baur Chaubert
Dr. med. Christian Georg Bayerl
Dr. med. Marc Beer
Dr. med. Sabina Berezowska
Dr. med. Steffen Bergelt
Dr. med. Barbara Elisabeth Berger-Denzler
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...