2015-02-21 4 views
0

Я пытаюсь разобрать информацию на веб-странице http://www.baseball-reference.com/teams/BOS/2000-pitching.shtml в Python с помощью BeautifulSoup. Я хочу распечатать соответствующее имя каждого игрока для таблицы «Team Pitching». Однако код повторяет имя игроков после определенного имени (в этом случае после строки 15 он повторяет имя «Pedro Martinez»,). Например:?Почему я не могу разобрать эту HTML-страницу в Python?

1 Pedro Martinez 
2 Jeff Fassero* 
3 Ramon Martinez 
4 Pete Schourek* 
5 Rolando Arrojo 
6 Tomo Ohka 
7 Derek Lowe 
8 Tim Wakefield 
9 Rich Garces 
10 Rheal Cormier* 
11 Hipolito Pichardo 
12 Brian Rose 
13 Bryce Florie 
14 John Wasdin 
15 Pedro Martinez 
16 Jeff Fassero* 
17 Ramon Martinez 
18 Pete Schourek* 
19 Rolando Arrojo 
20 Tomo Ohka 
21 Derek Lowe 
22 Tim Wakefield 
23 Rich Garces 
24 Rheal Cormier* 
25 Hipolito Pichardo 
26 Brian Rose 
27 Bryce Florie 
28 John Wasdin 

у вас есть представление о том, что происходит Это мой код:

# Sample web page 
#http://www.baseball-reference.com/teams/BOS/2000-pitching.shtml 


import urllib2 
import lxml 
from bs4 import BeautifulSoup 

# Download webpages 2010 webpage 

y = 2000 
url = 'http://www.baseball-reference.com/teams/BOS/'+ str(y) +'-pitching.shtml' 
print 'Download from :', url 

#dowlnload 
filehandle = urllib2.urlopen(url) 


fileout = 'YEARS'+str(y)+'.html' 
print 'Save to : ', fileout, '\n' 

#save file to disk 
f = open(fileout,'w') 
f.write(filehandle.read()) 
f.close() 


# Read and parse the html file 

# Parse information about the age of players in 2000 

y = 2000 

filein = 'YEARS' + str(y) + '.html' 
print(filein) 
soup = BeautifulSoup(open(filein)) 


entries = soup.find_all('tr', attrs={'class' : ''}) #' non_qual' '' 
print(len(entries)) 

i = 0 
for entry in entries: 


    columns = entry.find_all('td') 
    #print(len(columns), 'i:', i) 
    if len (columns)==34: # Number of columns of the table 

     i = i + 1 

     #print i, len(columns) 
     age = columns[2].get_text() 

     print i, age 
+0

Вы хотите извлечь? И что и где таблица? –

+3

Код, который вы показываете, разбит двумя способами - использует переменные 'year' и' table', которые никогда не определены. Исправляя его, чтобы использовать 'y' и' soup' вместо этого, он работает нормально - делает ** не ** воспроизводит упоминаемую вами ошибку (и в 2010 году нет «Pedro Martinez»: это Джон Лэки, Джон Лестер и т. Д.). –

+0

Использование 2000 (как указано в тексте), а не 2010 (как в вашем коде), и снова с именами исправлений выше wrt, # 1 действительно является Pedro Martinez, но, опять же, никакой ошибки - # 15 является Rod Beck и т. д. –

ответ

0

вы пытались перебрать все строки в таблице, без фактического получения все теги таблицы сначала. Таким образом, вы получаете все теги таблицы, а затем просматриваете все теги tr в тегах таблицы, если это имеет смысл. Также year и table были неопределенными, поэтому я предположил, что год был y и составил table переменная t. В качестве дополнительной заметки вам не нужно загружать HTML-код, а затем открывать его для его синтаксического анализа, вы можете просто получить HTML-код, получив текст соединения и разбор непосредственно.

import urllib2 
from bs4 import BeautifulSoup 

# Download webpages 2010 webpage 

y = 2010 
url = 'http://www.baseball-reference.com/teams/BOS/'+ str(y) +'-pitching.shtml' 
print 'Download from :', url 

#dowlnload 
filehandle = urllib2.urlopen(url) 


fileout = 'YEARS'+str(y)+'.html' 
print 'Save to : ', fileout, '\n' 

#save file to disk 
f = open(fileout,'w') 
f.write(filehandle.read()) 
f.close() 


# Read and parse the html file 

# Parse information about the age of players in 2000 

y = 2010 

filein = 'YEARS' + str(y) + '.html' 
print(filein) 
soup = BeautifulSoup(open(filein)) 


table = soup.find_all('table', attrs={'id': 'team_pitching'}) #' non_qual' '' 


for t in table: 

    i = 1 
    entries = t.find_all('tr', attrs={'class' : ''}) #' non_qual' '' 
    print(len(entries)) 
    for entry in entries: 
     columns = entry.find_all('td') 
     printString = str(i) + ' ' 
     for col in columns: 
      try: 
       if ((',' in col['csk']) and (col['csk'] != '')): 
        printString = printString + col.text 
        i = i + 1 
        print printString 
      except: 
       pass 
+0

heinst, ваша рекомендация имеет смысл вообще. Тем не менее, программа по-прежнему повторяет имена после строки 15, я имею в виду, что она начинается снова в Педро Мартинесе? Есть идеи? – Paul

+0

Я не вижу pedro martinez нигде на столе @Paul – heinst

+0

Я использую данные из 2000 вместо 2010. Но я все еще вижу проблему после строки 15 @heinst – Paul

Смежные вопросы