2013-09-24 2 views
1

Я очищаю веб-сайт, используя Python 2.7 и Beautiful Soup 3.2. Я новичок в обоих языках, но из документации я немного начал.Beautiful Soup throws `IndexError`

Я читаю следующие документации: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#contents http://thepcspy.com/read/scraping-websites-with-python/

Что я делаю, и есть сейчас (часть, которая терпит неудачу):

# Import the classes that are needed 
import urllib2 
from BeautifulSoup import BeautifulSoup 

# URL to scrape and open it with the urllib2 
url = 'http://www.wiziwig.tv/competition.php?competitionid=92&part=sports&discipline=football' 
source = urllib2.urlopen(url) 

# Turn the saced source into a BeautifulSoup object 
soup = BeautifulSoup(source) 

# From the source HTML page, search and store all <td class="home">..</td> and it's content 
hometeamsTd = soup.findAll('td', { "class" : "home" }) 
# Loop through the tag and store only the needed information, being the home team 
hometeams = [tag.contents[1] for tag in hometeamsTd] 

# From the source HTML page, search and store all <td class="home">..</td> and it's content 
awayteamsTd = soup.findAll('td', { "class" : "away" }) 
# Loop through the tag and store only the needed information, being the away team 
awayteams = [tag.contents[1] for tag in awayteamsTd] 

Содержание tag.contents для hometeamsTd выглядит следующим образом:

[ 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'Harkemase Boys', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-6077" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'RKC Waalwijk', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-427" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'Dutch KNVB Beker', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-6758" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'PSV', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-3" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'Ajax', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-2" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'Dutch KNVB Beker', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-6758" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'SC Heerenveen', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-14" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'Feyenoord', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-9" />], 
    [<img class="flag" src="/gfx/flags/nl.gif" alt="nl" />, u'Dutch KNVB Beker', <img src="/gfx/favourite_off.gif" alt="fav icon" class="fav off" id="team-6758" />] 
] 

Содержание tag.contents для awayteamsTd выглядит следующим образом:

[ 
    [u'Away-team'], 
    [<img src="/gfx/favourite_off.gif" class="fav off" alt="fav icon" id="team-13" />, u'NEC', <img class="flag" src="/gfx/flags/nl.gif" alt="nl" />], 
    [<img src="/gfx/favourite_off.gif" class="fav off" alt="fav icon" id="team-11" />, u'Heracles', <img class="flag" src="/gfx/flags/nl.gif" alt="nl" />], 
    [<img src="/gfx/favourite_off.gif" class="fav off" alt="fav icon" id="team-428" />, u'Stormvogels Telstar', <img class="flag" src="/gfx/flags/nl.gif" alt="nl" />], 
    [<img src="/gfx/favourite_off.gif" class="fav off" alt="fav icon" id="team-419" />, u'FC Volendam', <img class="flag" src="/gfx/flags/nl.gif" alt="nl" />], 
    [<img src="/gfx/favourite_off.gif" class="fav off" alt="fav icon" id="team-7" />, u'FC Twente', <img class="flag" src="/gfx/flags/nl.gif" alt="nl" />], 
    [<img src="/gfx/favourite_off.gif" class="fav off" alt="fav icon" id="team-415" />, u'FC Dordrecht', <img class="flag" src="/gfx/flags/nl.gif" alt="nl" />] 
] 

проблемы я пытаюсь решить, но не совсем получить еще есть:

  • Код awayteams = [tag.contents[1] for tag in awayteamsTd] прошлифованных ошибку: IndexError: list index out of range. Что, конечно, верно, потому что, как вы можете видеть на выходе tag.contents для awayteamsTd, есть первая запись [u'Away-team']. Вот почему он терпит неудачу. Но как я могу удалить/пропустить этот?
  • В hometeams выходе все работает, но я хотел бы, чтобы исключить те, где текст голландский KNVB Бекер происходит

ответ

1

Проблема заключается в том, что «далеко» клетки (имя столбца) находится внутри тд с "прочь" класса:

<thead class="title"> 
    ... 
    <tr class="sub"> 
     ... 
     <td>Home-team</td> 
     <td></td> 
     <td class="away">Away-team</td> 
     <td class="broadcast">Broadcast</td> 
    </tr> 
    </thead> 
</thead> 

Просто пропустите его с помощью нарезка:

awayteamsTd = soup.findAll('td', { "class" : "away" })[1:] 

Кроме того, если вы хотите, чтобы исключить Dutch KNVB Beker из списка домашних команд, добавить условие для выражения списка понимания:

hometeams = [tag.contents[1] for tag in hometeamsTd if tag.contents[1] != 'Dutch KNVB Beker'] 
0
awayteams = [] 
for tag in awayteamsTd: 
    if len(tag.contents) > 1: 
     awayteams.append(tag.contents[1])