BS4: ошибка атрибута в веб-очистке с Python - PullRequest
0 голосов
/ 10 апреля 2020

Мне нужно извлечь с этого сайта ссылку название города, где расположены магазины. Я создал этот код:

def get_page_data(number):
    print('number:', number)

    url = 'https://www.biedronka.pl/pl/sklepy/lista,lat,52.25,lng,21,page,'.format(number)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    container = soup.find(class_='s-content shop-list-page')
    items = container.find_all(class_='shopListElement')

    dane = []
    for item in items:
        miasto = item.find(class_='h4').get_text(strip=True)
        adres = item.find(class_='shopFullAddress').get_text(strip=True)
        dane.append([adres])

    return dane

wszystkie_dane = []
for number in range(1, 2):
    dane_na_stronie = get_page_data(number)

    wszystkie_dane.extend(dane_na_stronie)

dane = pd.DataFrame(wszystkie_dane, columns=['miasto','adres'])

dane.to_csv('biedronki_lista.csv', index=False)

Проблема появляется в:

   miasto = item.find(class_='h4').get_text(strip=True)
AttributeError: 'NoneType' object has no attribute 'get_text'

Есть идеи, как извлечь название города (в h4) с этого сайта?

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

class_='h4' - это атрибут, которому вы передаете имя тега классу, который вместо этого является неправильным:

miasto = item.find('h4').get_text(strip=True)
2 голосов
/ 10 апреля 2020

Попробуйте использовать:

miasto = item.find('h4').text.split()[0]

Или:

miasto = item.find('h4').get_text(strip=True)

Примечание:

"h4" - это тег, а не класс.


Объяснение:

  • Когда вы даете .find ('h4'), он возвращает:
<h4 style="margin-bottom: 10px;">

                Rzeszów             <span class="shopFullAddress">ul.<span class="shopAddress"> </span></span>
  • Когда вы даете .text, он возвращает:
'Rzeszów            \tul.'
  • Когда вы даете .split (), он возвращает:
['Rzeszów', 'ul.']
  • И из этого мы берем то, что нам требуется.

Так что делайте это везде, где вы сталкиваетесь с ошибкой в ​​этом коде.

dane = []
    for item in items:
        miasto = item.find('h4').get_text(strip=True)
        adres = item.find('shopFullAddress').get_text(strip=True)
        dane.append([adres])
...