2013-09-08 3 views
1

다음을 기반으로 기본 HTML 페이지에서 데이터를 가져 오는 스크립트를 작성하고 있습니다.여러 URL에서 파이썬의 HTML 파일을 읽으려면 어떻게해야합니까?

URL의 첫 번째 매개 변수는 -90.0에서 90.0 사이에 떠 있고 두 번째 숫자 세트는 - 180.0 및 180.0 (포함). URL을 통해 페이지의 본문으로 단일 번호가있는 하나의 페이지로 이동합니다 (예 : http://jawbone-virality.herokuapp.com/scanner/desert/-89.7/131.56/). URL에 첨부 된 모든 페이지 사이에서 가장 큰 바이럴 번호를 찾아야합니다.

그래서 지금은 첫 번째와 두 번째 숫자뿐만 아니라 본문의 번호 (우리는 그것을 virality라고 부름)를 인쇄합니다. 그것은 단지 콘솔에 출력하는 것이므로, 파일에 쓰려고 할 때마다 나에게 spazz하고 오류가 발생합니다. 어떤 힌트 나 내가 놓친 거있어? 나는 파이썬에 아주 익숙해서 무언가 또는 무엇인가를 놓치고 있는지 확신 할 수 없다.

import shutil 
import os 
import time 
import datetime 
import math 
import urllib 
from array import array 
myFile = open('test.html','w') 
m = 5 
for x in range(-900,900,1): 
    for y in range(-1800,1800,1): 
     filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/'+str(x/10)+'/'+str(y/10)+'/') 
     print 'Planet Desert: (' + str(x/10) +','+ str(y/10) + '), Virality: ' + filehandle.readlines()[0] #lines 
     #myFile.write('Planet Desert: (' + str(x/10) +','+ str(y/10) + '), Virality: ' + filehandle.readlines()[0]) 
myFile.close() 
filehandle.close() 

고맙습니다!

+0

무슨 오류가 있습니까? –

+2

약간 주제에서 벗어나지 만이 코드는 약 650 만 건의 HTTP 요청을 처리합니다. 그렇다면 Queue와 함께 멀티 스레드 방식을 사용하는 것이 더 나을 것입니다. http://docs.python.org/2/library/queue.html#module-Queue –

+1

[Scrapy] (http : // scrapy.org/)이 문제에 대해 (이미 내 경험에 쓰여 있음). – Aufziehvogel

답변

0

파일에 쓸 때 이전에 print 문이 남아 있습니까? 그렇다면 readlines()으로 전화하면 파이썬 advances the file pointer to the end of the file이 문제가 될 것입니다. 따라서 readlines()에 대한 두 번째 호출은 빈 목록을 반환하고 첫 번째 요소에 대한 액세스는 IndexError이됩니다.

filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/0/0/') 
print(filehandle.readlines()) # prints ['5'] 
print(filehandle.readlines()) # prints [] 

용액 변수에 그 결과를 저장 한 다음을 사용하는 것이다

이 실행 예를 참조. 이 웹 사이트의 형식은 순수한 정수 보인다 때문에
filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/0/0/') 
res = filehandle.readlines()[0] 
print(res) # prints 5 
print(res) # prints 5 

그러나, 이미, 필요하지 않습니다 여기 readlines()를 호출 코멘트에 지적했다. 따라서 선의 개념은 실제로 존재하지 않거나 적어도 더 이상의 정보를 제공하지 않습니다. 그러므로 더 쉬운 함수 read() (여기에는 readline()이 필요하지 않습니다)을 대신 사용하십시오.

filehandle = urllib.urlopen('http://jawbone-virality.herokuapp.com/scanner/desert/0/0/') 
res = filehandle.read() 
print(res) # prints 5 

소스 코드에 또 다른 문제가 있습니다. 귀하의 사용법에서 urllib.urlopen()을 파생시킬 수 있습니다. 파이썬 2를 사용하고 있습니다. 그러나 파이썬 2에서 정수의 나눗셈은 C 또는 Java 에서처럼 처리되어 정수로 반올림됩니다. 따라서 전화 번호는 http://jawbone-virality.herokuapp.com/scanner/desert/-90/-180/입니다.

는 하나 해결할 수 있습니다 :

희망 사용.

관련 문제