¿Cómo puedo leer el contenido de una URL con Python?

93

Lo siguiente funciona cuando lo pego en el navegador:

http://www.somesite.com/details.pl?urn=2344

Pero cuando intento leer la URL con Python no pasa nada:

 link = 'http://www.somesite.com/details.pl?urn=2344'
 f = urllib.urlopen(link)           
 myfile = f.readline()  
 print myfile

¿Necesito codificar la URL o hay algo que no veo?

Helen Neely
fuente

Respuestas:

156

Para responder tu pregunta:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)
myfile = f.read()
print(myfile)

Necesitas read(), noreadline()

EDITAR (2018-06-25): Desde Python 3, el legado urllib.urlopen()fue reemplazado por urllib.request.urlopen()(consulte las notas de https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen para obtener más detalles) .

Si está usando Python 3, vea las respuestas de Martin Thoma o innm dentro de esta pregunta: https://stackoverflow.com/a/28040508/158111 (Python 2/3 compat) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

O simplemente obtenga esta biblioteca aquí: http://docs.python-requests.org/en/latest/ y úsela seriamente :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)
aturdido
fuente
@KiranSubbaraman es un proyecto realmente bueno, desde las API hasta la estructura del código
woozyking
También recomiendo y animo al programador a utilizar la nueva marca requestsModule, su uso se corresponde con un código más Pythonic.
Hans Zimermann
1
Recibo el siguiente error en Python 3.5.2: Traceback (most recent call last): File "/home/lars/parser.py", line 9, in <module> f = urllib.urlopen(link) AttributeError: module 'urllib' has no attribute 'urlopen'Parece que no hay una función urlopen en Python 3.5. ¿Ha sido renombrado? EDITAR: El fragmento en la respuesta a continuación resuelve:from urllib.request import urlopen
LMD
@ user7185318 sí, en Python 3, el urlibpaquete vio algunas refactorizaciones y cambios en la API. Actualizaré la respuesta para enfatizar en Python 2.
woozyking
¿Qué pasa si el enlace proporcionado solicita nombre de usuario y contraseña? Entonces, ¿cómo se puede cambiar el código?
Dr. Essen
27

Para los python3usuarios, para ahorrar tiempo, use el siguiente código,

from urllib.request import urlopen

link = "https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html"

f = urlopen(link)
myfile = f.read()
print(myfile)

Sé que hay diferentes hilos de error:, Name Error: urlopen is not definedpero pensé que esto podría ahorrar tiempo.

innm
fuente
Esta no es la mejor manera de leer datos de una URL usando python3 porque pierde los beneficios de la declaración 'with'. Vea mi respuesta: stackoverflow.com/a/56295038/908316
Jared
no, esto no funcionará en el ciclo while. una sola llamada. que es una mierda si me preguntas
lone_coder
10

Una solución que funciona con Python 2.X y Python 3.X hace uso de la biblioteca de compatibilidad de Python 2 y 3 six:

from six.moves.urllib.request import urlopen
link = "http://www.somesite.com/details.pl?urn=2344"
response = urlopen(link)
content = response.read()
print(content)
Martín Thoma
fuente
8

Ninguna de estas respuestas es muy buena para Python 3 (probado en la última versión en el momento de esta publicación).

Así es como lo haces ...

import urllib.request

try:
   with urllib.request.urlopen('http://www.python.org/') as f:
      print(f.read().decode('utf-8'))
except urllib.error.URLError as e:
   print(e.reason)

Lo anterior es para contenidos que devuelven 'utf-8'. Elimine .decode ('utf-8') si desea que Python "adivine la codificación apropiada".

Documentación: https://docs.python.org/3/library/urllib.request.html#module-urllib.request

Jared
fuente
Gracias, el código original fue escrito para Python 2, pero su contribución aquí ha sido notada.
Helen Neely
2

Podemos leer el contenido html del sitio web de la siguiente manera:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)
Akash K
fuente
2
Esta es la misma que la respuesta de @innm
PeyM87
1
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Works on python 3 and python 2.
# when server knows where the request is coming from.

import sys

if sys.version_info[0] == 3:
    from urllib.request import urlopen
else:
    from urllib import urlopen
with urlopen('https://www.facebook.com/') as \
    url:
    data = url.read()

print data

# When the server does not know where the request is coming from.
# Works on python 3.

import urllib.request

user_agent = \
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'

url = 'https://www.facebook.com/'
headers = {'User-Agent': user_agent}

request = urllib.request.Request(url, None, headers)
response = urllib.request.urlopen(request)
data = response.read()
print data
ARVIND CHAUHAN
fuente
0

La URL debe ser una cadena:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)           
myfile = f.readline()  
print myfile
ATOzTOA
fuente
11
Ambos 'y "son cadenas en Python
Leo
0

Use el siguiente código:

import urllib

def read_text():
      quotes = urllib.urlopen("https://s3.amazonaws.com/udacity-hosted-downloads/ud036/movie_quotes.txt")
      contents_file = quotes.read()
      print contents_file

read_text()
Giorgio Giuliani
fuente
0
# retrieving data from url
# only for python 3

import urllib.request

def main():
  url = "http://docs.python.org"

# retrieving data from URL
  webUrl = urllib.request.urlopen(url)
  print("Result code: " + str(webUrl.getcode()))

# print data from URL 
  print("Returned data: -----------------")
  data = webUrl.read().decode("utf-8")
  print(data)

if __name__ == "__main__":
  main()
ksono
fuente
0
from urllib.request import urlopen

# if has Chinese, apply decode()
html = urlopen("https://blog.csdn.net/qq_39591494/article/details/83934260").read().decode('utf-8')
print(html)
荷兰 哲学家 Elvira
fuente
Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. Una explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
codificado
0

Puede utilizar bibliotecas requestsy beautifulsouppara leer datos en un sitio web. Simplemente instale estas dos bibliotecas y escriba el siguiente código.

import requests
import bs4
help(requests)
help(bs4)

Obtendrá toda la información que necesita sobre la biblioteca.

Rajodiya Jeel
fuente
helpse utiliza para ver la documentación del módulo / clase / función dada. Creo que esa pregunta pide una forma de ver el contenido de la respuesta
Panagiotis Simakis
Gracias, pero esta es una pregunta muy antigua y ya ha sido respondida. Gracias y bienvenido a stackoverflow.
Helen Neely