Как я могу использовать Python для очистки многостраничной таблицы и экспорта в файл CSV? - PullRequest
0 голосов
/ 28 октября 2019

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

Я посмотрел в Интернете и перепробовал много итераций и сейчас очень расстроен. Как вы можете сказать из кода, я новичок в кодировании!

import bs4 as bs
import urllib.request
import pandas as pd
import csv


max_page_num = 14
max_page_dig = 1 # number of digits in the page number


with open('result.csv',"w") as f:
    f.write("Name, Gender, State, Position, Grad, Club/HS, Rating, Commitment \n")

for i in range(0, max_page_num):  
    page_num = (max_page_dig - len(str(i))) * "0" +str(i) #gives a string in the format of 1, 01 or 001, 005 etc
    print(page_num)
    source = "https://www.topdrawersoccer.com/search/?query=&divisionId=&genderId=m&graduationYear=2020&positionId=0&playerRating=&stateId=All&pageNo=" + page_num + "&area=commitments"
    print(source)

    url = urllib.request.urlopen(source).read()    

    soup = bs.BeautifulSoup(url,'lxml')
    table = soup.find('table')
    table_rows = table.find_all('tr')

    for tr in table_rows:
        td = tr.find_all('td')
        row = [i.text for i in td]
        #final = row.strip("\n")
        #final = row.replace("\n","")
        with open('result.csv', 'a') as f:
            f.write(row)

Кажется, когда я пишу в CSV, он перезаписывает предыдущие. Это также вставляет это в одну строку, и имя игроков соединяется с названием школы. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 28 октября 2019

Я думаю, у вас проблема с внутренней петлей for. Попробуйте переписать его как

with open('result.csv', 'a') as f:
   for tr in table_rows:
      td = tr.find_all('td')
      row = [i.text for i in td]
      f.write(row)

и посмотрите, работает ли он.

В целом, это, вероятно, можно сделать проще, используя панд. Попробуйте изменить цикл for на:

for i in range(0, max_page_num):  
   page_num = ...
   source = ....
   df = pd.read_html(source)
   df.to_csv('results.csv', header=False, index=False, mode='a') #'a' should append each table to the csv file, instead of overwriting it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...