Почему при запуске кода выдается ошибка('NoneType' object has no attribute 'text')?

Рейтинг: 0Ответов: 2Опубликовано: 17.03.2023
import requests
from bs4 import BeautifulSoup
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}
def g(url):
    response = requests.get(url=url, headers=headers)
    soup = BeautifulSoup(response.text, 'lxml')

    ip = soup.find('div', class_='ip').text
    print(ip)


def main():
    g(url='https://2ip.ru')


if __name__ == '__main__':
    main()

Ответы

▲ 0

Что бы получить по данному методу нужный тег и его данные нужен JavaScript который в библиотеке requests (как я понял вы используете его для доступа к html) не реализован и ответ в этом случае вы получаете несколько иной, чем видите в браузере. Вы можете удостовериться в этом, если просто сделаете print() для html документа, который вы получили.

Для доступа к тегу по вашему методу можно использовать selenium или playwright которые полностью эмулируют работу браузера, то есть загружают страничку так же, как видите вы в браузере.

Но, кстати, получить ip можно даже и с этого ответа, который дает requests, а именно с помощью данного метода:

div_gen = soup.find('div').stripped_strings
str_1, str_2, str_3, str_4, ip = div_gen
print(ip)

На будущее просто посмотрите и изучите DOM html документа который приходит вам в ответ, часто он может отличаться от того что вы видите в браузере.

▲ 0

На самом деле, по правилам хорошего стиля программирования, функцию g() надо было написать вот так:

def g(url):
    response = requests.get(url=url, headers=headers)
    if response.status_code != 200:
        print(f"Страница {url} не найдена")
        return
    soup = BeautifulSoup(response.text, 'lxml')

    ip = soup.find('div', class_='ip')
    # Если find() не может ничего найти, он возвращает None:
    if ip is None:
        print("Ничего не найдено")
        return
    else:
        print(ip.text)

И тогда бы вы увидели, в чём причина проблемы:

Ничего не найдено

А вот почему этот тег не находится, вопрос другой..