2015-05-22 3 views
0
import requests 
from bs4 import BeautifulSoup 
import csv 
from urlparse import urljoin 
import urllib2 
from lxml import html 

base_url = 'http://www.pro-football-reference.com' # base url for concatenation 
data = requests.get("http://www.pro-football-reference.com/years/2014/games.htm") #website for scraping 
soup = BeautifulSoup(data.content) 
list_of_cells = [] 

for link in soup.find_all('a'): 
    if link.has_attr('href'): 
     if link.get_text() == 'boxscore': 
      url = base_url + link['href'] 
      for x in url: 
       response = requests.get('x') 
       html = response.content 
       soup = BeautifulSoup(html) 
       table = soup.find('table', attrs={'class': 'stats_table x_large_text'}) 
       for row in table.findAll('tr'): 
        for cell in row.findAll('td'): 
         text = cell.text.replace(' ', '') 
         list_of_cells.append(text) 
         print list_of_cells 

Я использую код, чтобы получить все коды boxscore от http://www.pro-football-reference.com/years/2014/games.htm. После того, как я получу эти теги boxscore, я хотел бы пропустить их, чтобы очистить данные за квартал за каждую команду, но мой синтаксис всегда кажется вне зависимости от того, как я форматирую код.Синтаксические проблемы при очистке данных

Если возможно, я хотел бы очистить больше, чем только данные о погоде, также получая информацию о игре, должностных лиц и ожидаемые очки за игру.

ответ

0

Если вы измените петлю немного:

for link in soup.find_all('a'): 

    if not link.has_attr('href'): 
     continue 

    if link.get_text() != 'boxscore': 
     continue 

    url = base_url + link['href'] 

    response = requests.get(url) 
    html = response.content 
    soup = BeautifulSoup(html) 

    # Scores 
    table = soup.find('table', attrs={'id': 'scoring'}) 
    for row in table.findAll('tr'): 
     for cell in row.findAll('td'): 
      text = cell.text.replace(' ', '') 
      list_of_cells.append(text) 
      print list_of_cells 

Это возвращает каждый из ячеек для каждой строки в выигрыше table для каждой страницы, связанной с с «boxscore» текстом.

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

  1. Вы пытались перебрать каждый символ в href вернулся в «boxscore» ссылку.
  2. Вы всегда запрашивали строку 'x'.
  3. Не так много проблем, но я изменил селектор таблиц, чтобы определить таблицу по ее «0», а не class. Идентификаторы должны быть уникальными на странице (хотя нет никакой гарантии).

я рекомендую вам найти каждый table (или элемент HTML), содержащий данные, которые вы хотите в главном цикле (например, score_table = soup.find('table'...), но что вы перемещаете код, который анализирует эти данные (например) ...

for row in table.findAll('tr'): 
    for cell in row.findAll('td'): 
     text = cell.text.replace(' ', '') 
     list_of_cells.append(text) 
     print list_of_cells 

... в отдельную функцию, которая возвращает указанные данные (по одному для каждого типа данных, которые вы извлекаете), просто чтобы код был немного более управляемым. Чем больше кода отступают для обработки тестов if и for, тем сложнее, чем обычно, следует следить за потоком. Например:

score_table = soup.find('table', attrs={'id': 'scoring'}) 
score_data = parse_score_table(score_table) 

other_table = soup.find('table', attrs={'id': 'other'}) 
other_data = parse_other_table(other_table) 
Смежные вопросы