Comment puis-je lire le contenu d'une URL avec Python?

93

Ce qui suit fonctionne lorsque je le colle sur le navigateur:

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

Mais lorsque j'essaye de lire l'URL avec Python, rien ne se passe:

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

Dois-je encoder l'URL ou y a-t-il quelque chose que je ne vois pas?

Helen Neely
la source

Réponses:

156

Pour répondre à ta question:

import urllib

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

Vous devez read(), pasreadline()

EDIT (2018-06-25): Depuis Python 3, l'héritage a urllib.urlopen()été remplacé par urllib.request.urlopen()(voir les notes de https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen pour plus de détails) .

Si vous utilisez Python 3, consultez les réponses de Martin Thoma ou innm dans cette question: https://stackoverflow.com/a/28040508/158111 (Python 2/3 compat) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Ou, obtenez simplement cette bibliothèque ici: http://docs.python-requests.org/en/latest/ et utilisez-la sérieusement :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)
woozyking
la source
@KiranSubbaraman c'est un très bon projet, des API à la structure de code
woozyking
Je recommande et encourage également le programmeur à utiliser le nouveau requestsmodule de marque , son utilisation se traduit par un code plus pythonique.
Hans Zimermann
1
J'obtiens l'erreur suivante sur python 3.5.2: Il 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'semble qu'il n'y ait pas de fonction urlopen dans python 3.5. At-il été renommé? EDIT: L'extrait de réponse ci-dessous résout:from urllib.request import urlopen
LMD
@ user7185318 oui dans Python 3, le urlibpackage a subi une refactorisation et des modifications d'API. Je vais mettre à jour la réponse pour mettre l'accent sur Python 2.
woozyking
Que faire si le lien fourni demande un nom d'utilisateur et un mot de passe? Comment alors le code peut-il être changé?
Dr Essen
27

Pour les python3utilisateurs, pour gagner du temps, utilisez le code suivant,

from urllib.request import urlopen

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

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

Je sais qu'il existe différents threads pour l'erreur:, Name Error: urlopen is not definedmais j'ai pensé que cela pourrait gagner du temps.

innm
la source
Ce n'est pas la meilleure façon de lire des données à partir d'une URL en utilisant python3 car il manque les avantages de l'instruction 'with'. Voir ma réponse: stackoverflow.com/a/56295038/908316
Jared
non cela ne fonctionnera pas sur la boucle while. un seul appel. ce qui est nul si vous me demandez
lone_coder
11

Une solution fonctionnant avec Python 2.X et Python 3.X utilise la bibliothèque de compatibilité Python 2 et 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)
Martin Thoma
la source
8

Aucune de ces réponses n'est très bonne pour Python 3 (testé sur la dernière version au moment de cet article).

Voici comment vous procédez ...

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)

Ce qui précède concerne les contenus qui renvoient «utf-8». Supprimez .decode ('utf-8') si vous voulez que python "devine l'encodage approprié".

Documentation: https://docs.python.org/3/library/urllib.request.html#module-urllib.request

Jared
la source
Merci, le code original a été écrit pour Python 2, mais votre contribution ici a été notée.
Helen Neely
2

Nous pouvons lire le contenu html du site Web comme ci-dessous:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)
Akash K
la source
2
C'est la même chose que la réponse 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
la source
0

L'URL doit être une chaîne:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)           
myfile = f.readline()  
print myfile
ATOzTOA
la source
11
Les deux "et" sont des chaînes en Python
Leo
0

J'ai utilisé le code suivant:

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
la source
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
la source
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
la source
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
codedge
0

Vous pouvez utiliser requestset beautifulsoupbibliothèques pour lire des données sur un site Web. Installez simplement ces deux bibliothèques et tapez le code suivant.

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

Vous obtiendrez toutes les informations dont vous avez besoin sur la bibliothèque.

Rajodiya Jeel
la source
helpest utilisé pour afficher la documentation du module / classe / fonction donné. Je pense que cette question demande un moyen de voir le contenu de la réponse
Panagiotis Simakis
Merci, mais c'est vraiment une vieille question, et on a déjà répondu. Merci et bienvenue sur stackoverflow.
Helen Neely