Как получить доступ к div в gridview с помощью Beautiful Soup

#html #beautifulsoup

#HTML #beautifulsoup

Вопрос:

Я пытаюсь собрать всю информацию из archdaily на нескольких страницах веб-сайта (например, со страницы 1 по 20).

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

     <div>
      <div class = 'afd-container-main afd-container-main--margin-bottom nft-container-main-search clearfix afd-mobile-margin search-container'>
        ::before
          <div>
            <div class='gridview'>
              <div>
                <div data-insights-category>
                  <a href = '...'> # this is the htmls i wanted
 

Код, который я использую, это

 soup = BeautifulSoup(html, 'html')
for foo in soup.find_all('div'):
    bar = foo.find('div', attrs={'class': 'afd-container-main afd-container-main--margin-bottom nft-container-main-search clearfix afd-mobile-margin search-container'})
    print(bar.text)
 

Сообщение об ошибке

 AttributeError: 'NoneType' object has no attribute 'text'
 

Я что-то недопонимаю?

Комментарии:

1. Во-первых, загляните в свой суп — почти в 99% случаев информация, которую ищут люди, отсутствует в супе — Просто чтобы улучшить ваш вопрос, было бы здорово добавить также информацию о том, как вы получаете свой html, исправляете опечатки и правильное сообщение об ошибке — Спасибо

Ответ №1:

Примечание: Поскольку вопрос не раскрывает, как вы получаете свой HTML-код, ответить на него не так-то просто.

Если вы используете requests , вы не получите результатов таким образом, потому что сайт имеет дело с динамическим обслуживаемым контентом.

Альтернативные подходы:
  • Получить информацию с requests помощью api (предоставляет еще больше информации — категории, компании, …)
     #iterate over pages
    for p in range(1,3):
        r = requests.get(f'https://www.archdaily.com/search/api/v1/us/projects/categories/residential-architecture?page={p}') #url of next page
        for item in r.json()['results']:
            # iterate over results and print title url
            print(item['title'], item['url'])
     
  • Получить визуализацию html через Selenium

Пример

 import requests

for p in range(1,2):
    r = requests.get(f'https://www.archdaily.com/search/api/v1/us/projects/categories/residential-architecture?page={p}') #url of next page
    for item in r.json()['results']:
        print(item['title'], item['url'])
 

Вывод

 Wooden House / derksen | windt architecten https://www.archdaily.com/972995/wooden-house-derksen-windt-architecten?ad_source=searchamp;ad_medium=projects_tab
PLA2 House / Dersyn Studio https://www.archdaily.com/972939/pla2-house-dersyn-studio?ad_source=searchamp;ad_medium=projects_tab
gjG House / BLAF Architecten https://www.archdaily.com/951845/gjg-house-blaf-architecten?ad_source=searchamp;ad_medium=projects_tab
Leopoldo 1201 Residential Building / aflalo/gasperini arquitetos https://www.archdaily.com/972959/leopoldo-1201-residential-building-aflalo-gasperini-arquitetos?ad_source=searchamp;ad_medium=projects_tab
Sayang House / Carlos Gris Studio https://www.archdaily.com/972773/sayang-house-carlos-gris-studio?ad_source=searchamp;ad_medium=projects_tab
Nong Ho 17 House / Skarn Chaiyawat https://www.archdaily.com/972911/nong-ho-17-house-skarn-chaiyawat?ad_source=searchamp;ad_medium=projects_tab
LÂM’s Home / AD studio https://www.archdaily.com/972794/lams-home-ad-plus-studio?ad_source=searchamp;ad_medium=projects_tab
Limestone House / John Wardle Architects  https://www.archdaily.com/972958/limestone-house-john-wardle-architects?ad_source=searchamp;ad_medium=projects_tab
Quay Wall House / Thomas Kemme Architects https://www.archdaily.com/971781/quay-wall-house-thomas-kemme-architects?ad_source=searchamp;ad_medium=projects_tab
...
 

Комментарии:

1. я не знал динамического содержимого и застрял там. большое спасибо за ваше предложение!

2. Мы все здесь для того, чтобы учиться и развиваться — вы разработаете стратегии, позволяющие избежать подобных камней преткновения в будущем. Ищите официальный api, вызовы api, используйте selenium, ….