Como posso ler o conteúdo de um URL com Python?

91

O seguinte funciona quando eu colo no navegador:

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

Mas quando tento ler o URL com Python, nada acontece:

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

Preciso codificar o URL ou há algo que não estou vendo?

Helen Neely
fonte

Respostas:

155

Para responder à sua pergunta:

import urllib

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

Você precisa read(), nãoreadline()

EDIT (25/06/2018): desde o Python 3, o legado urllib.urlopen()foi substituído por urllib.request.urlopen()(consulte as notas de https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen para obter detalhes) .

Se você estiver usando Python 3, veja as respostas de Martin Thoma ou innm nesta pergunta: https://stackoverflow.com/a/28040508/158111 (Python 2/3 compat) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Ou apenas pegue esta biblioteca aqui: http://docs.python-requests.org/en/latest/ e use-a a sério :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)
tonto
fonte
@KiranSubbaraman é um projeto muito bom, das APIs à estrutura do código
estonteante
Eu também recomendo e incentivo o programador a usar a nova marca requestsModule, seu uso rende para um código mais Pythônico.
Hans Zimermann
1
Estou recebendo o seguinte erro no 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 não há função urlopen no python 3.5. Foi renomeado? EDIT: O snippet na resposta abaixo resolve:from urllib.request import urlopen
LMD
@ user7185318 sim no Python 3 o urlibpacote viu algumas mudanças de refatoração e API. Vou atualizar a resposta para enfatizar no Python 2.
woozyking
e se o link fornecido solicitar nome de usuário e senha? Como então o código pode ser alterado?
Dr. Essen,
26

Para os python3usuários, para economizar tempo, use o seguinte 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)

Eu sei que existem diferentes tópicos para erro Name Error: urlopen is not defined:, mas pensei que isso poderia economizar tempo.

innm
fonte
Esta não é a melhor maneira de ler dados de um url usando o python3 porque perde os benefícios da instrução 'with'. Veja minha resposta: stackoverflow.com/a/56295038/908316
Jared
10

Uma solução que funciona com Python 2.X e Python 3.X usa a biblioteca de compatibilidade Python 2 e 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
fonte
8

Nenhuma dessas respostas é muito boa para Python 3 (testado na versão mais recente até o momento desta postagem).

É assim que se faz...

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)

O texto acima é para conteúdos que retornam 'utf-8'. Remova .decode ('utf-8') se quiser que o python "adivinhe a codificação apropriada".

Documentação: https://docs.python.org/3/library/urllib.request.html#module-urllib.request

Jared
fonte
Obrigado, o código original foi escrito para Python 2, mas sua contribuição aqui foi notada.
Helen Neely
2

Podemos ler o conteúdo html do site conforme abaixo:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)
Akash K
fonte
2
Esta é a mesma resposta de @innm
PeyM87
0

O URL deve ser uma string:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)           
myfile = f.readline()  
print myfile
ATOzTOA
fonte
11
Ambos 'e "são strings em Python
Leo
0

Usei o seguinte 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
fonte
0
#!/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
fonte
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
fonte
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
fonte
Obrigado por este trecho de código, que pode fornecer alguma ajuda limitada e imediata. Uma explicação adequada melhoraria muito seu valor a longo prazo, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras questões semelhantes. Por favor edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
código de
0

Você pode usar requestse beautifulsoupbibliotecas para ler dados em um site. Basta instalar essas duas bibliotecas e digitar o código a seguir.

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

Você obterá todas as informações de que precisa sobre a biblioteca.

Rajodiya Jeel
fonte
helpé usado para ver a documentação de determinado módulo / classe / função. Acho que essa pergunta pede uma maneira de ver o conteúdo da resposta
Panagiotis Simakis
Obrigado, mas essa é uma pergunta muito antiga e já foi respondida. Obrigado e bem-vindo ao stackoverflow.
Helen Neely