AttributeError: у объекта 'NoneType' нет атрибута 'текст' | BeautifulSoup - PullRequest
0 голосов
/ 13 февраля 2020
import requests
from bs4 import BeautifulSoup
from requests_html import HTMLSession

#Request URL
page = requests.get('https://www.fifa.com/worldcup/players.html')

#Fetch webpage
soup = BeautifulSoup(page.content,"html.parser")  

player_age = soup.find("div",{"class":"fi-p__profile number__number"}).text.replace("\n","").strip()
print(player_age)

Ошибка:

AttributeError: объект 'NoneType' не имеет атрибута 'text'

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

Ах, хорошо. Понимаю. Вы неправильно указали URL. Во-первых, вам нужно сбросить .html. Во-вторых, вам нужно найти URL-адреса, которые на самом деле могут получить данные. К сожалению, нет конечной точки API (которую я вижу здесь), чтобы получить данные игрока.

Поэтому немного другой подход заключается в том, чтобы получить доступ к каждому профилю игрока и получить его таким образом. Но для того, чтобы попасть в профиль игрока, вам нужен playerID для итерации. Это займет некоторое время, так как нужно извлечь из профиля / URL каждого игрока, но выполнить работу:

import requests
from bs4 import BeautifulSoup
from requests_html import HTMLSession

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}

#Get playerIDs
url = 'https://www.fifa.com/worldcup/players/_libraries/byposition/all/_players-list'
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.text,"html.parser")  

playerIDs = soup.find_all('a', {'class':'fi-p--link '})
playerDict = {}
for player in playerIDs:
    name = player.find('div',{'class':'fi-p__name'}).text.strip()
    playerID = player['data-player-id']

    playerDict[name] = playerID


for player_name, playerID in playerDict.items():
    #Request URL
    url = 'https://www.fifa.com/worldcup/_libraries/players/player/%s/_player-profile-data' %playerID
    page = requests.get(url, headers=headers)

    #Fetch webpage
    soup = BeautifulSoup(page.text,"html.parser")  
    player_age = soup.find('div',{'class':'fi-p__profile-number__number'}).text.strip()

    print('%-20s Age: %s' %(player_name, player_age))

Вывод:

Aaron MOOY           Age: 29
ABDALLA SAID         Age: 34
Abdiel ARROYO        Age: 26
Abdoulaye DIALLO     Age: 27
ABDULLAH ALKHAIBARI  Age: 23
ABDULLAH ALMUAIOUF   Age: 33
ABDULLAH OTAYF       Age: 27
Abdullahi SHEHU      Age: 26
ABDULMALEK ALKHAIBRI Age: 33
Abel AGUILAR         Age: 35
Achraf HAKIMI        Age: 21
Adama MBENGUE        Age: 26
Adem LJAJIC          Age: 28
Adil RAMI            Age: 34
Adnan JANUZAJ        Age: 25
Adolfo MACHADO       Age: 34
ADRIEN SILVA         Age: 30
AHMED ELMOHAMADY     Age: 32
AHMED FATHI          Age: 35
...
0 голосов
/ 13 февраля 2020

одна переменная не может найти div и классифицировать ваш путь к коду на странице запроса и не может распечатать его, потому что этот адрес не существует.

Я анализировал Steam-сайт, и я получаю это сообщение об ошибке

https://store.steampowered.com/games/ после того, как вы перейдете на вкладку "Скоро в продаже", вы увидите, что в некоторых играх нет информации о цене, это означает, что в моем поисковом элементе нет элементов. Так что я сделал, если еще заговорил для вывода и сработал.

Я пытаюсь объяснить это, надеюсь, кто-то поможет, что

for game in games:
    print(game.find("div", attrs={"class": "tab_item_name"}).text)
    a = game.find("div", attrs={"class", "discount_final_price"})
    if type(a) == type(ty):
        print(a.string)
    else:
        print("unknown")
    print(game.get("href"))

0 голосов
/ 13 февраля 2020

Ошибка говорит нам, что soup.find("div",{"class":"fi-p__profile number__number"}) ничего не нашел. И ничто (None или NoneType) не может иметь никаких атрибутов.

Кстати, указанная вами ссылка возвращает ошибку 404. Кажется, вы пытаетесь разобрать страницу без запрошенных данных.

...