Estoy tratando de conseguir los datos de este sitio web:
http://www.boursorama.com/includes/cours/last_transactions.phtml?symbole=1xEURUS

Parece urlopen no obtener el código html y no entiendo por qué.
Va como:

html = urllib.request.urlopen("http://www.boursorama.com/includes/cours/last_transactions.phtml?symbole=1xEURUS")
print (html)

Mi código es correcto, puedo obtener el código fuente html de otras páginas web con el mismo código, pero parece que no reconoce esta dirección.

imprime: b»

Tal vez en otra biblioteca es la más adecuada? Por qué urlopen no devuelve el código html de la página web?
gracias!

  • La búsqueda de los hilos en la web de connexions sujeto en LO habría hecho dar un montón de información. Pero eso no es una falta grave para un usuario nuevo, de todos modos. Así que me upvoted USTED, no es la cuestión, la bienvenida ASÍ.
InformationsquelleAutor prince | 2011-08-23

3 Comentarios

  1. 4

    Personalmente , yo escribo:

    # Python 2.7
    
    import urllib
    
    url = 'http://www.boursorama.com/includes/cours/last_transactions.phtml?symbole=1xEURUS'
    sock = urllib.urlopen(url)
    content = sock.read() 
    sock.close()
    
    print content

    Et si tu parles français,.. bonjour sur stackoverflow.com !

    actualización de 1

    De hecho, yo prefiero ahora emplear el siguiente código, porque es más rápido:

    # Python 2.7
    
    import httplib
    
    conn = httplib.HTTPConnection(host='www.boursorama.com',timeout=30)
    
    req = '/includes/cours/last_transactions.phtml?symbole=1xEURUS'
    
    try:
        conn.request('GET',req)
    except:
         print 'echec de connexion'
    
    content = conn.getresponse().read()
    
    print content

    Cambiar httplib a http.client en este código debería ser suficiente para adaptarse a Python 3.

    .

    Confirmo que, con estos dos códigos, puedo obtener el código fuente en la que puedo ver los datos en los que está interesado:

            <td class="L20" width="33%" align="center">11:57:44</td>
    
            <td class="L20" width="33%" align="center">1.4486</td>
    
            <td class="L20" width="33%" align="center">0</td>
    
    </tr>
    
                                            <tr>
    
            <td  width="33%" align="center">11:57:43</td>
    
            <td  width="33%" align="center">1.4486</td>
    
            <td  width="33%" align="center">0</td>
    
    </tr>

    actualización 2

    Añadir el siguiente fragmento de código para el código anterior le permitirá extraer los datos supongo que quieren:

    for i,line in enumerate(content.splitlines(True)):
        print str(i)+' '+repr(line)
    
    print '\n\n'
    
    
    import re
    
    regx = re.compile('\t\t\t\t\t\t<td class="(?:gras )?L20" width="33%" align="center">(\d\d:\d\d:\d\d)</td>\r\n'
                      '\t\t\t\t\t\t<td class="(?:gras )?L20" width="33%" align="center">([\d.]+)</td>\r\n'
                      '\t\t\t\t\t\t<td class="(?:gras )?L20" width="33%" align="center">(\d+)</td>\r\n')
    
    print regx.findall(content)

    resultado (sólo el final)

    .......................................
    .......................................
    .......................................
    .......................................
    98 'window.config.graphics = {};\n'
    99 'window.config.accordions = {};\n'
    100 '\n'
    101 "window.addEvent('domready', function(){\n"
    102 '});\n'
    103 '</script>\n'
    104 '<script type="text/javascript">\n'
    105 '\t\t\t\tsas_tmstp = Math.round(Math.random()*10000000000);\n'
    106 '\t\t\t\tsas_pageid = "177/(includes/cours/last_transactions)"; //Page : boursorama.com/smartad_test\n'
    107 '\t\t\t\tvar sas_formatids = "8968";\n'
    108 '\t\t\t\tsas_target = "symb=1xEURUS#"; //TargetingArray\n'
    109 '\t\t\t\tdocument.write("<scr"+"ipt src=\"http://ads.boursorama.com/call2/pubjall/" + sas_pageid + "/" + sas_formatids + "/" + sas_tmstp + "/" + escape(sas_target) + "?\"></scr"+"ipt>");\t\t\t\t\n'
    110 '\t\t\t</script><div id="_smart1"><script language="javascript">sas_script(1,8968);</script></div><script type="text/javascript">\r\n'
    111 "\twindow.addEvent('domready', function(){\r\n"
    112 'sas_move(1,8968);\t});\r\n'
    113 '</script>\n'
    114 '<script type="text/javascript">\n'
    115 'var _gaq = _gaq || [];\n'
    116 "_gaq.push(['_setAccount', 'UA-1623710-1']);\n"
    117 "_gaq.push(['_setDomainName', 'www.boursorama.com']);\n"
    118 "_gaq.push(['_setCustomVar', 1, 'segment', 'WEB-VISITOR']);\n"
    119 "_gaq.push(['_setCustomVar', 4, 'version', '18']);\n"
    120 "_gaq.push(['_trackPageLoadTime']);\n"
    121 "_gaq.push(['_trackPageview']);\n"
    122 '(function() {\n'
    123 "var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n"
    124 "ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n"
    125 "var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n"
    126 '})();\n'
    127 '</script>\n'
    128 '</body>\n'
    129 '</html>'
    
    
    
    [('12:25:36', '1.4478', '0'), ('12:25:33', '1.4478', '0'), ('12:25:31', '1.4478', '0'), ('12:25:30', '1.4478', '0'), ('12:25:30', '1.4478', '0'), ('12:25:29', '1.4478', '0')]

    Espero que no los va a «jugar» el comercio en el Forex: es uno de la mejor manera de perder dinero rápidamente.

    actualización 3

    Lo SIENTO ! Me olvidé de usted con Python 3. Así que yo creo que debe definir la expresión regular tal que:

    regx = re.compilar(b‘\t\t\t\t\t……)

    es decir, con b antes de la cadena, de lo contrario obtendrá un error como en esta pregunta

    • Él utiliza Python 3. El código no funcionará.
    • Merci, no voy a ser capaz de probar el código hasta esta noche. Está usted seguro de que usted obtenga el código fuente html con ella? Y sí, estoy en python 3 😉
    • Sí, lo entiendo, yo rara vez de códigos post que yo no la prueba. Pero estoy usando Python 2.7. Luego entendí que estás con Python 3, ver print(html) con paréntesis, pero no me trate de Python 3 lo suficiente como para saber que mi código de fallar en Python 3. Lo siento
    • Merci beaucoup!
    • httplib no existe en Python 3, y te sugiero no usar regex para algo que usted debe manejar con un analizador (BeautifulSoup et al).
    • S. sabemos, lo sabemos. Es agotador tener siempre esa misma reacción cuando alguien utiliza expresiones regulares para extraer datos de código fuente HTML. El fragmento de código que funciona y lo escribí en 2 minutos. Estás listo para ayudar a los Jefe el aprendizaje BeautifulSoup durante 1 o 2 horas ? Por el camino, BS es 10 veces más lento que una pura expresión de la aplicación.
    • Justo lo suficiente — yo creo que él debe ser dicho que no es siempre una buena idea. El uso de una biblioteca significa que usted no tiene a mano el código, expresiones regulares, que a su vez deja el código más robusto (y más legible), y usted no tendrá que arreglar un error cada vez que mal HTML rompe su expresión regular. Pero entiendo tu punto de vista; a veces se puede utilizar expresiones regulares.
    • S. estoy de acuerdo: «no siempre es una buena manera. Pero es mejor para la persona a saber por qué y cuando. Es esencialmente el análisis de stricto sensu que no es posible con expresiones regulares; pero aquí, él no quiere analizar, él sólo quiere analizar y encontrar un particular y limitada porción del código fuente. – En el punto de fijación de errores con frecuencia, que no es el caso cuando es siempre la misma porción de código que se analiza, es lo que yo creo, tal vez estoy equivocado ? – Por cierto, que me encanta, expresiones regulares, así que no es un problema para mí para crear una expresión regular de patrón.

  2. 4

    Lo que sospecho que está sucediendo es que el servidor está enviando datos comprimidos sin decirle que lo que está haciendo. Python estándar HTTP biblioteca no puede manejar formatos de compresión.
    Yo sugeriría conseguir httplib2, que puede manejar formatos comprimidos (y por lo general es mucho mejor que urllib).

    import httplib2
    folder = httplib2.Http('.cache')
    response, content = folder.request("http://www.boursorama.com/includes/cours/last_transactions.phtml?symbole=1xEURUS")

    print(response) nos muestra la respuesta del servidor:

    {«status»: ‘200’, ‘content-length’: ‘7787’, ‘x-sid’: ’26,E’, ‘content-language»: ‘fr’, ‘set-cookie’: ‘PHPSESSIONID=ed45f761542752317963ab4762ec604f; path=/; domain=.www.boursorama.com’, ‘caduca’: ‘Thu, 19 de Noviembre de 1981, 08:52:00 GMT’, ‘variar’: ‘Accept-Encoding,el Agente de Usuario’, ‘server’: ‘nginx’, ‘conexión’: ‘keep-alive’, ‘-content-encoding’: ‘gzip’, ‘pragma’: ‘no-cache’, ‘cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0’, ‘fecha’: ‘Tue, 23 Aug 2011 10:26:46 GMT’, ‘content-type’: ‘text/html; charset=ISO-8859-1’, ‘content-location’: ‘http://www.boursorama.com/includes/cours/last_transactions.phtml?symbole=1xEURUS’}

    Mientras esto no se confirme que estaba comprimido (ahora estamos diciendo al servidor que podemos manejar compresiones, después de todo), sí que prestar un poco de peso a la teoría.

    El contenido real vive en, usted lo adivinó, content. Mirando brevemente nos muestra que se está trabajando (solo voy a pegar un poquito):

    b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"\n\t"http://

    Editar: sí, este crea una carpeta con el nombre .caché; he encontrado que siempre es mejor trabajar con carpetas cuando se trata de httplib2, y siempre se puede eliminar la carpeta después.

    • Yo upvote porque he aprendido algo gracias a tu respuesta.
  3. 2

    He probado la URL con el httplib2 y en el terminal con curl. Ambos funcionan bien:

    URL = "http://www.boursorama.com/includes/cours/last_transactions.phtml?symbole=1xEURUS"
    h = httplib2.Http()
    resp, content = h.request(URL, "GET")
    print(content)

    Así que para mí, o hay un error en urllib.solicitar o no es realmente extraño interacción cliente-servidor sucediendo.

    • Se trataba de un error tipográfico, Mi verdadero código de incluir el «» para hacer una cadena.. no funciona. Mi pregunta es una pregunta real
    • es probablemente el servidor de envío de los datos comprimidos, urllib es un poco limitado.
    • Por desgracia, no; la respuesta está vacía y en Python 2 también funciona bien. Debe ser específico para Python 3 y urllib.solicitud.
    • pero Content-length es 7787 en response = urllib.request.urlopen(url), lo cual indicaría que algo se envía a lo largo del mero encabezados — lo mira con herramientas en línea mostrar el contenido de la misma longitud, pero el actual código fuente, lo que implica que no es una respuesta vacía. Así que sí, hay algo raro con urllib.solicitud.

Dejar respuesta

Please enter your comment!
Please enter your name here