2016-01-05 3 views
-1

Je ne comprends pas pourquoi le code suivant continue de produire une chaîne vide. J'essaie d'obtenir le code pour extraire le contenu du site Web dans un fichier "txt", mais il continue à produire une chaîne vide. Y a-t-il une erreur dans le code?Le code continue de produire une chaîne vide

import urllib3 
import certifi 


# Function: Convert information within html document to a text file 
# Append information to the file 
def html_to_text(source_html, target_file): 

    http = urllib3.PoolManager(
     cert_reqs='CERT_REQUIRED',  # Force certificate check. 
     ca_certs=certifi.where(),  # Path to the Certifi Bundle 
     headers={'connection': 'keep-alive', 'user-agent': 'Mozilla/5.0', 'accept-encoding': 'gzip, deflate'}, 
    ) 

    r = http.urlopen('GET', source_html) 
    print(source_html) 
    response = r.read().decode('utf-8') 
    # TODO: Find the problem that keeps making the code produce an empty string 
    print(response) 
    temp_file = open(target_file, 'w+') 
    temp_file.write(response) 


source_address = "https://sg.finance.yahoo.com/lookup/all?s=*&t=A&m=SG&r=&b=0" 
target_location = "C:\\Users\\Admin\\PycharmProjects\\TheLastPuff\\Source\\yahoo_ticker_symbols.txt" 

html_to_text(source_address, target_location) 
+1

Quand vous dites « produire », voulez-vous dire « imprimé », ou « écrit dans un fichier », ou « à la fois imprimé et écrit dans un fichier »? Est-ce que 'print (source_html)' et 'print (response)' imprime quelque chose ou pas? – Kevin

+0

Les fonctions d'impression et d'écriture ne produisent rien. "print (source_html)" imprime le "source_address" avec succès. – Cloud

+0

L'objet 'r' semble avoir un attribut' r.data' qui contient le corps de la réponse. http://urllib3.readthedocs.org/en/latest/#usage – Jasper

Répondre

0

Je reçois une réponse avec le code suivant. Le seul changement pertinent est d'utiliser r.data au lieu de r.read().

import urllib3 
import certifi 


def html_to_text(source_html): 

    http = urllib3.PoolManager(
     cert_reqs='CERT_REQUIRED',  # Force certificate check. 
     ca_certs=certifi.where(),  # Path to the Certifi Bundle 
     headers={'connection': 'keep-alive', 'user-agent': 'Mozilla/5.0', 'accept-encoding': 'gzip, deflate'}, 
    ) 

    r=http.urlopen('GET', source_html) 
    print(source_html) 
    print(r.headers) 
    response = r.data     # instead of read().decode('utf-8') 
    print(response) 


source_address = "https://sg.finance.yahoo.com/lookup/all?s=*&t=A&m=SG&r=&b=0" 

html_to_text(source_address) 

versions d'occasion:

>>> certifi.__version__ 
'2015.11.20.1' 
>>> urllib3.__version__ 
'1.14' 
>>> sys.version 
'3.5.1 (default, Dec 7 2015, 12:58:09) \n[GCC 5.2.0]' 
+0

Ce code semble fonctionner, mais j'ai une autre erreur: "urllib.error.HTTPError: HTTP Error 502: Server Hangup". Je pense que c'est le site qui me met dehors. – Cloud