2012-04-24 7 views
-1

안녕 얘들 아!파이썬 - 뒤틀린 : 형태의 POST

나는 아직도 Twisted를 발견하고 있으며이 스크립트를 HTML 테이블의 내용을 구문 분석하여 Excel로 작성했습니다. 이 스크립트는 잘 작동합니다! 내 질문에 하나의 웹 페이지 (http://bandscore.ielts.org/)에 대해서도 동일한 작업을 수행 할 수 있지만 모든 결과를 가져올 수있는 POST 요청이 많으면 beautifulSoup로 구문 분석 한 다음 넣을 수 있습니다. 엑셀로?

소스를 구문 분석하고 엑셀로 퍼팅하는 트위스트와 내가 구문 분석에 사용하는 스크립트입니다 (OK,하지만 난

이에 그것을 구현하기 위해 트위스트와 POST 요청을 수행하는 방법을 모른다) 다른 페이지 (나도 같은 스크립트를 작성할 수 있도록하려면,하지만 같은 페이지에 다른 POST 데이터를 많이하지 많은 페이지)으로의 많은 :

from twisted.web import client 
from twisted.internet import reactor, defer 
from bs4 import BeautifulSoup as BeautifulSoup 
import time 
import xlwt 

start = time.time() 
wb = xlwt.Workbook(encoding='utf-8') 
ws = wb.add_sheet("BULATS_IA_PARSED") 
global x 
x = 0 
Countries_List = ['Afghanistan','Armenia','Brazil','Argentina','Armenia','Australia','Austria','Azerbaijan','Bahrain','Bangladesh','Belgium','Belize','Bolivia','Bosnia and Herzegovina','Brazil','Brunei Darussalam','Bulgaria','Cameroon','Canada','Central African Republic','Chile','China','Colombia','Costa Rica','Croatia','Cuba','Cyprus','Czech Republic','Denmark','Dominican Republic','Ecuador','Egypt','Eritrea','Estonia','Ethiopia','Faroe Islands','Fiji','Finland','France','French Polynesia','Georgia','Germany','Gibraltar','Greece','Grenada','Hong Kong','Hungary','Iceland','India','Indonesia','Iran','Iraq','Ireland','Israel','Italy','Jamaica','Japan','Jordan','Kazakhstan','Kenya','Kuwait','Latvia','Lebanon','Libya','Liechtenstein','Lithuania','Luxembourg','Macau','Macedonia','Malaysia','Maldives','Malta','Mexico','Monaco','Montenegro','Morocco','Mozambique','Myanmar (Burma)','Nepal','Netherlands','New Caledonia','New Zealand','Nigeria','Norway','Oman','Pakistan','Palestine','Papua New Guinea','Paraguay','Peru','Philippines','Poland','Portugal','Qatar','Romania','Russia','Saudi Arabia','Serbia','Singapore','Slovakia','Slovenia','South Africa','South Korea','Spain','Sri Lanka','Sweden','Switzerland','Syria','Taiwan','Thailand','Trinadad and Tobago','Tunisia','Turkey','Ukraine','United Arab Emirates','United Kingdom','United States','Uruguay','Uzbekistan','Venezuela','Vietnam'] 
urls = ["http://www.cambridgeesol.org/institutions/results.php?region=%s&type=&BULATS=on" % Countries for Countries in Countries_List] 


def finish(results): 
    global x 
    for result in results: 
     print 'GOT PAGE', len(result), 'bytes' 
     soup = BeautifulSoup(result) 
     tableau = soup.findAll('table') 
    try: 
     rows = tableau[3].findAll('tr') 
     print("Fetching") 
     for tr in rows: 
     cols = tr.findAll('td') 
     y = 0 
     x = x + 1 
     for td in cols: 
      texte_bu = td.text 
      texte_bu = texte_bu.encode('utf-8') 
      #print("Writing...") 
        #print texte_bu 
      ws.write(x,y,td.text) 
      y = y + 1 
    except(IndexError): 
     print("No IA for this country") 
     pass 

    reactor.stop() 

waiting = [client.getPage(url) for url in urls] 
defer.gatherResults(waiting).addCallback(finish) 

reactor.run() 
wb.save("IALOL.xls") 
print "Elapsed Time: %s" % (time.time() - start) 

당신에게 대단히 감사합니다 미리 도움을 청하십시오!

답변

2

두 가지 옵션이 있습니다. getPage을 계속 사용하고 GET 대신 POST 또는 Agent을 사용하십시오.

API documentation for getPageAPI documentation for HTTPClientFactory으로 이동하여 추가 지원 옵션을 찾습니다.

후자의 API 설명서는 method을 명시 적으로 다루고 있으며 설명하기에는 좋지 않습니다. postdata. 그래서, getPagePOST로 만들려면 :.

d = getPage(url, method='POST', postdata="hello, world, or whatever.") 

overall web howto documentation index에서 연결된 howto-style document for Agent가 (이 (즉,)를 FileBodyProducer 예를 참조하십시오 몸 요청을 전송의 예를 보여주고있다

+2

합니다. 안녕 진 - 폴 칼데론, 답변을 많이 주셔서 대단히 감사합니다! 많이 도움이 되겠습니다! 당신에게 조금 문제가 있습니다 :) : 여기에 구현 된 솔루션 : http://pastebin.com/Xk9GSmvR이 오류가 발생합니다 : http : /pastebin.com/1b7ahvx6 내가 마지막으로 왜 그 이유를 알아낼 수 있다면 ... nna는 내 주인이 될 것입니다.) –

+0

편집 : 아마도 "실패 : exceptions.TypeError : 시퀀스 항목 6 : 예상 문자열, dict이 발견되었습니다" "postdata"때문에 문자열 대신 이상한 것을 넣을 수 있습니까? –

+0

아마도. 'postdata'의 값은'str' 타입이어야합니다. –