2014-01-21 2 views
0

웹에서 일부 테이블을 긁어서 csv에 저장하는 기능을 만들었지 만 왜 작동하지 않는지 알 수 없습니다. 다음은 웹을 긁을 때 값 오류 : 닫힌 파일에 대한 입출력 작업

내가 시도하는 코드입니다 :

record("A/041/0.html") 

이 출력은 다음과 같다 : 다음

import csv 
import urllib2 
from bs4 import BeautifulSoup 

def record (part) : 

     url="http://www.admision.unmsm.edu.pe/res20130914/{}".format(part) 
     u=urllib2.urlopen(url) 
     try: 
      html=u.read() 
     finally: 
      u.close() 
     soup=BeautifulSoup(html) 
     c=[] 
     for n in soup.find_all('center'): 
      for b in n.find_all('a')[2:]: 
       c.append(b.text) 

     t=(len(c)-2)/2   

      with open('name.csv', 'wb') as f: 
      writer = csv.writer(f) 

     for i in range(t): 
      url = "http://www.admision.unmsm.edu.pe/res20130914/A/011/{}.html".format(i) 
      u = urllib2.urlopen(url) 
     try: 
      html = u.read() 
     finally: 
      u.close() 
     soup=BeautifulSoup(html) 
     for tr in soup.find_all('tr')[2:]: 
      tds = tr.find_all('td') 
      row = [elem.text.encode('utf-8') for elem in tds[:4]] 
      writer.writerow(row) 

, 내 함수를 실행

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-119-cfa187b69dc4> in <module>() 
    37    writer.writerow(row) 
    38 
---> 39 record("A/041/0.html") 
    40 
    41 

<ipython-input-119-cfa187b69dc4> in record(part) 
    35    tds = tr.find_all('td') 
    36    row = [elem.text.encode('utf-8') for elem in tds[:4]] 
---> 37    writer.writerow(row) 
    38 
    39 record("A/041/0.html") 

ValueError: I/O operation on closed file 

어떤 기능을해야 그냥 this 방향으로 테이블 스크랩

당신이 쓰기를 시도하고 파일이 열리지 않은하는

ValueError: I/O operation on closed file 

:

답변

1

당신은 당신의 코드 with open('name.csv', 'wb') as f:

에 들여 쓰기 오류를 만들어 with 문에 writerow 메커니즘을 변경하려고합니다.

당신은

with open('name.csv', 'wb') as f: 
    writer = csv.writer(f) 

    for i in range(t): 
     url = "http://www.admision.unmsm.edu.pe/res20130914/A/011/{}.html".format(i) 
     u = urllib2.urlopen(url) 
    try: 
     html = u.read() 
    finally: 
     u.close() 
    soup=BeautifulSoup(html) 
    for tr in soup.find_all('tr')[2:]: 
     tds = tr.find_all('td') 
     row = [elem.text.encode('utf-8') for elem in tds[:4]] 
     writer.writerow(row) 

위의 코드는 나를 위해 잘 작동 시도 할 수 있습니다. 결과는 내 컴퓨터에 name.csv으로 저장됩니다. 출력은 다음과 같습니다.

455576,"ASTONITAS BELLO, ERIK JAVIER",011,1454.1250 
468012,"ASTORNE RAMÍREZ, SERGIO MIGUEL",011,  
486188,"ATALAYA CARPIO, MELANY LESLIE",011,639.3000 
..... 
1

오류는 여기 공짜입니다.

with open('name.csv', 'wb') as f: 
writer = csv.writer(f) 

writer.writerow(row) 

그것은 조금 불분명

, 당신은 name.csv을 출력하려고하는, 당신의 코드를 찾고?

당신은이 라인에 구문/파일 프로세스를 검토 할 수 있습니다 ..

+0

name은 만들고자하는 파일의 csv 이름입니다. – CreamStat

관련 문제