Tablo Bulamayan Güzel Çorba
Bu web sitesindeki verileri ayrıştırıyorum . Siteden birkaç şeyi ayrıştırdım, ancak bazı nedenlerden dolayı bu sayfa tablolardan birini bulamıyor. Sorunu gösteren basitleştirilmiş bir kod parçacığı:
#!/usr/bin/env python3
import bs4 as bs
import requests
def get_soup(site):
headers = {'User-Agent': 'Mozilla/5.0'}
r = requests.get(site, headers=headers)
#Always want a status code of 200, which means everything downloaded
if r.status_code != 200:
print(r.status_code)
print("Invalid Status Code")
exit(1)
return bs.BeautifulSoup(r.content, 'html.parser')
soup = get_soup("https://www.hockey-reference.com/boxscores/202008140WSH.html#all_advanced")
table = soup.find('table' , {'id' : "NYI_skaters"}).find('tbody').find_all('tr')
table = soup.find('table' , {'id' : "NYI_goalies"}).find('tbody').find_all('tr')
table = soup.find('table' , {'id' : "NYI_adv"}).find('tbody').find_all('tr')
Kod, patenciler ve kaleciler tablosunu sorun olmadan bulur, ancak _adv tablosunu bulamaz ve masayı bulamadığı için NoneType hatasıyla sonuçlanır. _Adv'nin altında bulunduğu bir düğüm bulabiliyorum:
table = soup.find('div' , {'id' : "all_advanced"})
Bu div etiketinin (all_advanced) altında tuhaf görünen bir kod var, bu yüzden bunun onunla bir ilgisi olup olmadığından emin değilim. Bu siteyle başka şeylerle ilgili herhangi bir sorun yaşamadım, asla selenyum kullanmaya ihtiyaç duymadım ve verileri kazıyan insanlarda sorun yok. Herhangi bir yardım memnuniyetle karşılanacaktır.
DÜZENLEME: panda.read_html kullanmak da onu bulmaz. Yukarıdaki tüm "table =" ifadelerini şununla değiştirerek bu sorunu çözmeyi başardım:
for comment in soup.find_all(text=lambda text: isinstance(text, bs.Comment)):
if comment.find("<table ") > 0:
comment_soup = bs.BeautifulSoup(comment, 'html.parser')
table = comment_soup.find('table' , {'id' : "NYI_adv"})
for player in table.find_all('tr' , {'class' : "ALLSH hidden"}):
print(player.find('a')['href'])
Teşekkürler
Yanıtlar
Tablo verilerini yorum bölümünden yüklemek için şu komut dosyasını kullanın:
import requests
from bs4 import BeautifulSoup, Comment
url = 'https://www.hockey-reference.com/boxscores/202008140WSH.html#all_advanced'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
# normal tables:
# table_skaters = soup.select_one('table#NYI_skaters')
# table_goalies = soup.select_one('table#NYI_goalies')
# table loaded from Comment:
table_advanced = soup.select_one('#all_advanced').find_next(text=lambda t: isinstance(t, Comment))
table_advanced = BeautifulSoup(table_advanced, 'html.parser')
# print(table_advanced)
for row in table_advanced.select('tr.ALL5v5'):
tds = [td.get_text(strip=True) for td in row.select('td, th')]
print(*tds, sep='\t')
Baskılar:
Josh Bailey 1 9 21 30.0 -32.1 3 1 75.0 0 1
Mathew Barzal 3 12 9 57.1 7.8 3 6 33.3 0 0
Anthony Beauvillier 4 10 21 32.3 -29.1 4 1 80.0 1 1
Derick Brassard 1 8 6 57.1 7.1 6 8 42.9 3 0
Casey Cizikas 2 14 7 66.7 20.4 4 5 44.4 1 0
Cal Clutterbuck 5 14 8 63.6 16.6 4 5 44.4 3 0
Jordan Eberle 3 14 9 60.9 13.2 3 6 33.3 1 0
Andy Greene 0 9 13 40.9 -13.6 6 8 42.9 2 1
Leo Komarov 2 10 7 58.8 9.5 7 8 46.7 5 1
Nick Leddy 2 13 20 39.4 -18.8 4 8 33.3 0 1
Anders Lee 2 13 6 68.4 22.0 2 7 22.2 0 0
Matt Martin 2 9 7 56.2 6.2 0 2 0.0 4 0
Scott Mayfield 1 16 11 59.3 11.8 4 4 50.0 3 1
Brock Nelson 2 9 19 32.1 -27.9 3 1 75.0 2 0
Jean-Gabriel Pageau 3 13 9 59.1 10.6 9 10 47.4 4 0
Adam Pelech 3 15 13 53.6 3.6 8 4 66.7 2 1
Ryan Pulock 5 18 14 56.2 8.0 6 9 40.0 0 1
Devon Toews 4 19 15 55.9 7.8 4 7 36.4 1 4
TOTAL 45 43 51.1 44.4 32 12
Travis Boyd 3 6 7 46.2 -3.1 3 5 37.5 0 1
John Carlson 5 19 14 57.6 14.0 5 12 29.4 2 1
Brenden Dillon 2 18 19 48.6 -0.4 7 2 77.8 0 3
Nic Dowd 1 3 6 33.3 -17.3 3 0 100.0 0 1
Lars Eller 1 17 21 44.7 -7.3 6 2 75.0 1 1
Carl Hagelin 1 7 8 46.7 -2.6 5 4 55.6 1 0
Garnet Hathaway 1 4 6 40.0 -10.0 3 0 100.0 2 0
Nick Jensen 0 3 12 20.0 -34.8 8 2 80.0 0 0
Michal Kempny 3 18 12 60.0 16.9 4 10 28.6 1 0
Ilya Kovalchuk 0 5 9 35.7 -15.7 3 7 30.0 3 0
Evgeny Kuznetsov 5 16 10 61.5 18.0 8 9 47.1 1 0
Dmitry Orlov 1 23 22 51.1 4.6 8 5 61.5 1 0
T.J. Oshie 4 21 19 52.5 6.7 5 2 71.4 2 1
Alex Ovechkin 8 16 13 55.2 9.4 8 9 47.1 4 0
Richard Panik 2 7 10 41.2 -9.5 5 1 83.3 0 0
Jonas Siegenthaler 1 5 11 31.2 -21.6 8 1 88.9 2 1
Jakub Vrana 3 13 16 44.8 -6.0 3 3 50.0 0 0
Tom Wilson 2 14 10 58.3 13.0 8 6 57.1 8 0
TOTAL 43 45 48.9 55.6 28 9