AttributeError:'NoneType'对象在tbody中没有属性'find'

时间:2018-10-02 07:57:19

标签: python web-scraping attributeerror

我很喜欢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 :(得分:1)

查看您要抓取的网站的源代码,看起来您所寻找的关键字不是id而是class

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

因此,您应该将代码更改为:

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

此外,您还应该将find.all更改为findAll

答案 1 :(得分:0)

读取错误是一项使您在编程时受益匪浅的技能。对于您来说,错误的重要部分是:

AttributeError: 'NoneType' object has no attribute 'find'的{​​{1}}上的

line 11

引发错误的实际代码行:...WebS.py

在该行的引用tbody = leaderboard.find("tbody")上调用了属性find,该错误告诉您leaderboard没有NoneType,因此意味着{{ 1}}。

要进一步分解错误,如果您仍然感到困惑(针对另一个错误),则应了解冒号之前的内容,在本例中为find。但最常见的是,您应该用Google搜索错误。

答案 2 :(得分:0)

请尝试以下操作以获得所需的输出。我忽略了第一个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)