我很喜欢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
答案 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)