#python #pandas #parsing #beautifulsoup
#python #pandas #синтаксический анализ #beautifulsoup
Вопрос:
Я загрузил несколько HTML-файлов, которые хочу проанализировать. Я смог проанализировать файлы, но теперь я хочу составить несколько списков, чтобы я мог сделать точечный график. Я совершенно новичок в Python, поэтому я не уверен, как превратить их в списки.
Я попытался установить переменную, равную тексту, который я получил из столбца.
for y in range (1977, 2020, 1):
tmp = random.random()*5.0
print ('Sleep for ', tmp, ' seconds')
time.sleep(tmp)
url = 'https://www.basketball-reference.com/teams/IND/' str(y) '_games.html'
print ('Download from :', url)
#dowlnload
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urlopen(req).read()
fileout = 'YEARS/' str(y) '.html'
print ('Save to : ', fileout, 'n')
#save file to disk
f = open(fileout,'w')
f.write(html.decode('utf-8'))
f.close()
#parse
for year in range (1977, 2019, 1):
filein = 'YEARS/' str(year) '.html'
soup = BeautifulSoup(open(filein), 'lxml')
entries = soup.find_all('tr', attrs={'class' : ''})
for entry in entries:
#print entry
columns = entry.find_all('td')
if len (columns)>4 :
#print ('C0: ', columns[4])
where = columns[4].get_text()
#print ('C1: ', columns[5])
opponent = columns[5].get_text()
#print ('C2: ', columns[6])
WL = columns[6].get_text()
#print ('C3: ', columns[8])
PacerScore = columns[8].get_text()
#print ('C4: ', columns[9])
OpponentScore = columns[9].get_text()
tt = where '|::|' opponent '|::|' WL '|::|' PacerScore '|::|' OpponentScore
print (tt)
x = PacerScore
y = OpponentScore
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
Я также пытался использовать read_html из pandas, но я что-то напортачил и не смог заставить это работать. Он продолжал сообщать мне, что функция не найдена.
#parse
for y in range (1977, 2019, 1):
filein = 'YEARS/' str(y) '.html'
soup = BeautifulSoup(open(filein), 'r')
table = BeautifulSoup(open('YEARS/' str(y) '.html','r').read()).find('table')
df = pd.read_html(table)
Любые советы или указания были бы с благодарностью приняты.
Комментарии:
1. Я бы рекомендовал использовать pyQuery для синтаксического анализа и чтения внутренних html-тегов внутри ваших HTML-файлов.
Ответ №1:
Если вы используете pandas .read_html()
, вам не нужно использовать beautifulsoup для поиска тегов таблицы. Pandas сделает это за вас. Вы также проделываете массу работы, чтобы сначала сохранить html, а затем проанализировать html. Почему бы не проанализировать html прямым способом, а затем, если хотите, просто сохранить эту таблицу?
Затем вы можете построить график, используя таблицу.
import requests
import pandas as pd
import numpy as np
import time
import random
headers={'User-Agent': 'Mozilla/5.0'}
for year in range (1977, 2020, 1):
tmp = random.random()*5.0
print ('Sleep for ', tmp, ' seconds')
time.sleep(tmp)
url = 'https://www.basketball-reference.com/teams/IND/' str(year) '_games.html'
response = requests.get(url, headers=headers)
tables = pd.read_html(url)
table = tables[0]
table = table[table['G'] != 'G']
table = table[['Unnamed: 5', 'Opponent','Unnamed: 7','Tm','Opp']]
table.columns = ['Where','Opponent','WL','PacerScore','OpponentScore']
table['Where'] = np.where(table.Where == '@', 'Away', 'Home')
print ('Download table from :', url)
table.to_csv('YEARS/' str(year) '.csv')
Ваша таблица будет выглядеть следующим образом, их вы можете просто сделать:
x = table['PacerScore']
y = table['OpponentScore']
чтобы получить ваши значения x и y для вашего точечного графика.
Вывод:
print (table.to_string())
Where Opponent WL PacerScore OpponentScore Season
0 Home Memphis Grizzlies W 111 83 2019
1 Away Milwaukee Bucks L 101 118 2019
2 Home Brooklyn Nets W 132 112 2019
3 Away Minnesota Timberwolves L 91 101 2019
4 Away San Antonio Spurs W 116 96 2019
5 Away Cleveland Cavaliers W 119 107 2019
6 Home Portland Trail Blazers L 93 103 2019
7 Away New York Knicks W 107 101 2019
8 Away Chicago Bulls W 107 105 2019
9 Home Boston Celtics W 102 101 2019
10 Home Houston Rockets L 94 98 2019
11 Home Philadelphia 76ers L 94 100 2019
12 Away Miami Heat W 110 102 2019
13 Away Houston Rockets L 103 115 2019
14 Home Miami Heat W 99 91 2019
15 Home Atlanta Hawks W 97 89 2019
16 Home Utah Jazz W 121 94 2019
17 Away Charlotte Hornets L 109 127 2019
18 Home San Antonio Spurs L 100 111 2019
19 Away Utah Jazz W 121 88 2019
21 Away Phoenix Suns W 109 104 2019
22 Away Los Angeles Lakers L 96 104 2019
23 Away Sacramento Kings L 110 111 2019
24 Home Chicago Bulls W 96 90 2019
25 Away Orlando Magic W 112 90 2019
26 Home Sacramento Kings W 107 97 2019
27 Home Washington Wizards W 109 101 2019
28 Home Milwaukee Bucks W 113 97 2019
29 Away Philadelphia 76ers W 113 101 2019
30 Home New York Knicks W 110 99 2019
31 Home Cleveland Cavaliers L 91 92 2019
32 Away Toronto Raptors L 96 99 2019
33 Away Brooklyn Nets W 114 106 2019
34 Home Washington Wizards W 105 89 2019
35 Away Atlanta Hawks W 129 121 2019
36 Home Detroit Pistons W 125 88 2019
37 Home Atlanta Hawks W 116 108 2019
38 Away Chicago Bulls W 119 116 2019
39 Away Toronto Raptors L 105 121 2019
40 Away Cleveland Cavaliers W 123 115 2019
42 Away Boston Celtics L 108 135 2019
43 Away New York Knicks W 121 106 2019
44 Home Phoenix Suns W 131 97 2019
45 Home Philadelphia 76ers L 96 120 2019
46 Home Dallas Mavericks W 111 99 2019
47 Home Charlotte Hornets W 120 95 2019
48 Home Toronto Raptors W 110 106 2019
49 Away Memphis Grizzlies L 103 106 2019
50 Home Golden State Warriors L 100 132 2019
51 Away Washington Wizards L 89 107 2019
52 Away Orlando Magic L 100 107 2019
53 Away Miami Heat W 95 88 2019
54 Away New Orleans Pelicans W 109 107 2019
55 Home Los Angeles Lakers W 136 94 2019
56 Home Los Angeles Clippers W 116 92 2019
57 Home Cleveland Cavaliers W 105 90 2019
58 Home Charlotte Hornets W 99 90 2019
59 Home Milwaukee Bucks L 97 106 2019
60 Home New Orleans Pelicans W 126 111 2019
61 Away Washington Wizards W 119 112 2019
63 Away Detroit Pistons L 109 113 2019
64 Away Dallas Mavericks L 101 110 2019
65 Home Minnesota Timberwolves W 122 115 2019
66 Home Orlando Magic L 112 117 2019
67 Home Chicago Bulls W 105 96 2019
68 Away Milwaukee Bucks L 98 117 2019
69 Away Philadelphia 76ers L 89 106 2019
70 Home New York Knicks W 103 98 2019
71 Home Oklahoma City Thunder W 108 106 2019
72 Away Denver Nuggets L 100 102 2019
73 Away Portland Trail Blazers L 98 106 2019
74 Away Los Angeles Clippers L 109 115 2019
75 Away Golden State Warriors L 89 112 2019
76 Home Denver Nuggets NaN NaN NaN 2019
77 Away Oklahoma City Thunder NaN NaN NaN 2019
78 Away Boston Celtics NaN NaN NaN 2019
79 Home Orlando Magic NaN NaN NaN 2019
80 Home Detroit Pistons NaN NaN NaN 2019
81 Away Detroit Pistons NaN NaN NaN 2019
82 Home Boston Celtics NaN NaN NaN 2019
84 Home Brooklyn Nets NaN NaN NaN 2019
85 Away Atlanta Hawks NaN NaN NaN 2019