Экспорт веб-соскоб в CSV-файл - PullRequest
0 голосов
/ 19 октября 2019
import csv
import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.cbssports.com/nba/stats/playersort/nba/year-2019-season-preseason-category-scoringpergame")
soup = BeautifulSoup(page.content, 'html.parser')

for record in soup.find_all('tr'):
    try:
        print(record.contents[0].text)
        print(record.contents[6].text)
        print(record.contents[7].text)
        print(record.contents[8].text)
        print(record.contents[9].text)
        print(record.contents[10].text)
        print(record.contents[12].text)
        print(record.contents[13].text)
        print(record.contents[14].text)
        print(record.contents[15].text)
    except:
        pass
    print('\n')

def scrape_data(url):

    response = requests.get("https://www.cbssports.com/nba/stats/playersort/nba/year-2019-season-preseason-category-scoringpergame", timeout=10)
    soup = BeautifulSoup(response.content, 'html.parser')

    table = soup.find_all('table')[1]

    rows = table.select('tbody > tr')

    header = [th.text.rstrip() for th in rows[1].find_all('th')]

    with open('statsoutput.csv', 'w') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(header)
        for row in rows[1:]:
            data = [th.text.rstrip() for th in row.find_all('td')]
            writer.writerow(data)


if __name__=="__main__":
    url = "https://www.cbssports.com/nba/stats/playersort/nba/year-2019-season-preseason-category-scoringpergame"
    scrape_data(url)

Я пытался экспортировать статистику с этой веб-страницы в csv file. когда я запускаю свой код, первая часть работает нормально и получает данные, которые я хочу. но функция не может экспортировать его в csv file, и я получаю эту ошибку:

table = soup.find_all('table')[1]
IndexError: list index out of range

, и я не совсем уверен, почему.

1 Ответ

3 голосов
/ 19 октября 2019

Вы получаете эту ошибку, потому что у этого сайта есть только один <table /> html элемент. Таким образом, soupe.find_all() возвращает список с длиной 1. Вы можете решить эту ошибку, выполнив soupe.find_all('table')[0] или, просто, soup.table.

Я также проверил и протестировал ваш код и рекомендую следующее:

table = soup.table
rows = table.find_all('tr')

После этих изменений все будет работать нормально. Вы можете проверить этот код здесь . Надеюсь, это поможет.

...