AttributeError: у объекта 'NoneType' нет атрибута 'find' внутри tbody - PullRequest
0 голосов
/ 02 октября 2018

Я новичок в поле python и пытаюсь настроить инструмент для создания веб-страниц.Итак, я экспериментирую с некоторыми кодами.

import requests
import bs4

website = requests.get("https://www.hltv.org/stats/teams")

soup = bs4.BeautifulSoup(website.text, "html.parser")

leaderboard = soup.find("table", {id: "stats-table player-ratings-table"})
tbody = leaderboard.find("tbody")

for tr in tbody.find.all('tr'):
    team = tr.find.all('td')[0].text.strip()
    maps = tr.find.all('td')[1].text.strip()
    kd = tr.find.all('td')[3].text.strip()
    rating = tr.find.all('td')[4].text.strip()

    print(team, maps, kd, rating)

Я получаю следующую ошибку, любая помощь?Я пользуюсь 2.7.

 File "/Users/*****/Python/New Webscraping/WebS.py", line 11, in <module>
    tbody = leaderboard.find("tbody")
AttributeError: 'NoneType' object has no attribute 'find'

Process finished with exit code 1

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Глядя на исходный код сайта, который вы пытаетесь очистить, похоже, что ключевое слово, которое вы ищете, это не id, а class:

<table class="stats-table player-ratings-table">

Так что вам следует изменитьВаш код:

leaderboard = soup.find("table", {'class': "stats-table player-ratings-table"})

Также вы должны изменить find.all на findAll.

0 голосов
/ 02 октября 2018

Попробуйте следующее, чтобы получить желаемый результат.Я проигнорировал первое значение tr, проиндексировав его как [1:], так как внутри него нет td.Более того, такого метода нет .find.all() в BeautifulSoup.Вы можете использовать .find_all() или .findAll() вместо.

import requests
from bs4 import BeautifulSoup

res = requests.get("https://www.hltv.org/stats/teams")
soup = BeautifulSoup(res.text, "html.parser")
for tr in soup.find("table",class_="player-ratings-table").find_all("tr")[1:]:
    team = tr.find_all('td')[0].text.strip()
    maps = tr.find_all('td')[1].text.strip()
    kd = tr.find_all('td')[3].text.strip()
    rating = tr.find_all('td')[4].text.strip()
    print(team, maps, kd, rating)
0 голосов
/ 02 октября 2018

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

AttributeError: 'NoneType' object has no attribute 'find' на line 11 из ...WebS.py

И фактическая строка кода, на которую была выдана ошибка: tbody = leaderboard.find("tbody").

Атрибут find был вызван по ссылке leaderboard в этой строке, и ошибка говорит вам, что NoneType s не имеет find, что означает leaderboard == None.

Чтобы дополнительно разбить ошибку, если вы все еще были в замешательстве (из-за другой ошибки), вам следует прочитать о том, что стоит перед этим двоеточием, в данном случае AttributeError.Но чаще всего вы должны погуглить ошибку.

...