web-dev-qa-db-fra.com

Comment lire du HTML à partir d'une URL en python 3

J'ai regardé des questions similaires précédentes et je suis devenu encore plus confus.

Dans python 3.4, je veux lire une page html sous forme de chaîne, compte tenu de l'url.

En Perl, je fais cela avec LWP :: Simple, en utilisant get ().

Un exemple de matplotlib 1.3.1 indique: import urllib; u1=urllib.urlretrieve(url). python3 ne trouve pas urlretrieve.

J'ai essayé u1 = urllib.request.urlopen(url), qui semble obtenir un objet HTTPResponse, mais je ne peux pas l'imprimer ou obtenir une longueur ou l'indexer.

u1.body n'existe pas. Je ne trouve pas de description du HTTPResponse en python3.

Y a-t-il un attribut dans l'objet HTTPResponse qui me donnera les octets bruts de la page html?

(Les éléments non pertinents des autres questions incluent urllib2, qui n'existe pas dans mon python, mes analyseurs csv, etc.)

Modifier:

J'ai trouvé quelque chose dans une question précédente qui fait partiellement (principalement) le travail:

u2 = urllib.request.urlopen('http://finance.yahoo.com/q?s=aapl&ql=1')

for lines in u2.readlines():
    print (lines)

Je dis "partiellement" parce que je ne veux pas lire des lignes séparées, mais juste une grosse chaîne.

Je pourrais simplement concaténer les lignes, mais chaque ligne imprimée a un caractère 'b' ajouté.

D'où cela vient-il?

Encore une fois, je suppose que je pourrais supprimer le premier caractère avant de concaténer, mais cela devient un kloodge.

24
user1067305

Notez que Python3 ne lit pas le code html comme une chaîne mais comme un bytearray, vous devez donc le convertir en un avec decode.

import urllib.request

fp = urllib.request.urlopen("http://www.python.org")
mybytes = fp.read()

mystr = mybytes.decode("utf8")
fp.close()

print(mystr)
50
davidgh

Essayez le module 'requêtes', c'est beaucoup plus simple.

#pip install requests for installation

import requests

url = 'https://www.google.com/'
r = requests.get(url)
r.text

plus d'infos ici> http://docs.python-requests.org/en/master/

26
Aaron T.

urllib.request.urlopen(url).read() devrait vous renvoyer la page HTML brute sous forme de chaîne.

9
user2629998
import requests

url = requests.get("http://yahoo.com")
htmltext = url.text
print(htmltext)

Cela fonctionnera comme urllib.urlopen.

8
Ramandeep Singh

La lecture d'une page html avec urllib est assez simple à faire. Puisque vous voulez le lire comme une seule chaîne, je vais vous montrer.

Importer urllib.request:

#!/usr/bin/python3.5

import urllib.request

Préparez notre demande

request = urllib.request.Request('http://www.w3schools.com')

tilisez toujours un "try/except" lors de la demande d'une page Web car les choses peuvent facilement aller mal. Urlopen () demande la page.

try:
    response = urllib.request.urlopen(request)
except:
    print("something wrong")

Type est une excellente fonction qui nous dira quel est le "type" d'une variable. Ici, la réponse est un objet http.response.

print(type(response))

La fonction de lecture de notre objet de réponse stockera le html sous forme d'octets dans notre variable. Encore une fois, tapez () vérifiera cela.

htmlBytes = response.read()

print(type(htmlBytes))

Maintenant, nous utilisons la fonction de décodage pour notre variable d'octets pour obtenir une seule chaîne.

htmlStr = htmlBytes.decode("utf8")

print(type(htmlStr))

Si vous souhaitez diviser cette chaîne en lignes distinctes, vous pouvez le faire avec la fonction split (). Dans ce formulaire, nous pouvons facilement parcourir pour imprimer la page entière ou effectuer tout autre traitement. =

htmlSplit = htmlStr.split('\n')

print(type(htmlSplit))

for line in htmlSplit:
    print(line)

J'espère que cela fournit une réponse un peu plus détaillée. Python sont excellents, je l'utiliserais comme référence car il répondra à la plupart des questions que vous pourriez avoir.

5
Discoveringmypath
import urllib
some_url = 'https://docs.python.org/2/library/urllib.html'
filehandle = urllib.urlopen(some_url)
print filehandle.read()
0
agamike