Почему при запуске кода выдается ошибка('NoneType' object has no attribute 'text')?
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()
Ответы (2 шт):
Что бы получить по данному методу нужный тег и его данные нужен 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 документа который приходит вам в ответ, часто он может отличаться от того что вы видите в браузере.
На самом деле, по правилам хорошего стиля программирования, функцию 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)
И тогда бы вы увидели, в чём причина проблемы:
Ничего не найдено
А вот почему этот тег не находится, вопрос другой..