Python ile bir URL'nin içeriğini nasıl okuyabilirim?


93

Tarayıcıya yapıştırdığımda aşağıdakiler çalışıyor:

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

Ancak URL'yi Python ile okumayı denediğimde hiçbir şey olmuyor:

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

URL'yi kodlamam gerekiyor mu yoksa görmediğim bir şey mi var?

Yanıtlar:


156

Soruna cevap vermek için:

import urllib

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

Gerek read()yokreadline()

DÜZENLEME (2018-06-25): Python 3'ten bu yana, mirasın urllib.urlopen()yerini almıştır urllib.request.urlopen()( ayrıntılar için https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen'deki notlara bakın) .

Python 3 kullanıyorsanız, bu soruda Martin Thoma veya innm tarafından verilen yanıtlara bakın: https://stackoverflow.com/a/28040508/158111 (Python 2/3 uyumlu) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Veya bu kitaplığı buradan edinin: http://docs.python-requests.org/en/latest/ ve ciddiye alın :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)

@KiranSubbaraman API'lerden kod yapısına kadar gerçekten iyi bir proje
woozyking

Ayrıca programcıyı yeni marka requestsModülünü kullanması için tavsiye ediyor ve teşvik ediyorum , bunun kullanımı daha Pythonic Koduna yol açar.
Hans Zimermann 01

1
Python 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'3.5.2'de aşağıdaki hatayı alıyorum: Python 3.5'te urlopen işlevi yok gibi görünüyor. Yeniden adlandırıldı mı? DÜZENLEME: Aşağıdaki yanıtta from urllib.request import urlopen
LMD

@ user7185318 evet Python 3'te urlibpaket bazı yeniden düzenleme ve API değişiklikleri gördü. Cevabı Python 2'yi vurgulamak için güncelleyeceğim
woozyking

sağlanan bağlantı kullanıcı adı ve şifre isterse ne olur? O halde kod nasıl değiştirilebilir?
Dr Essen

27

İçin python3kullanıcılar, zamandan tasarruf şu kodu kullanma,

from urllib.request import urlopen

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

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

Hata için farklı iş parçacıkları olduğunu biliyorum: Name Error: urlopen is not definedancak bunun zaman kazandıracağını düşündüm.


Python3 kullanarak bir url'den veri okumanın en iyi yolu bu değildir çünkü 'with' ifadesinin faydalarını gözden kaçırır. Cevabımı görün: stackoverflow.com/a/56295038/908316
Jared

hayır bu döngü sırasında çalışmayacaktır. sadece bir arama. Bana sorarsan bu berbat bir şey
lone_coder

11

Python 2.X ve Python 3.X ile çalışan bir çözüm, Python 2 ve 3 uyumluluk kitaplığını kullanır 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)

8

Bu cevapların hiçbiri Python 3 için pek iyi değil (bu yazı sırasında en son sürümde test edildi).

Bunu nasıl yapıyorsun ...

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)

Yukarıdakiler 'utf-8' döndüren içerikler içindir. Python'un "uygun kodlamayı tahmin etmesini" istiyorsanız .decode ('utf-8') öğesini kaldırın.

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


Teşekkürler, orijinal kod Python 2 için yazılmıştır, ancak buradaki katkınız not edilmiştir.
Helen Neely

2

Web sitesi html içeriğini aşağıdaki gibi okuyabiliriz:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)

2
Bu, @
innm'den

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

0

URL bir dize olmalıdır:

import urllib

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

11
Python'da hem 'hem de "dizelerdir
Aslan

0

Aşağıdaki kodu kullandım:

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()

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()

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)

Sınırlı ve anında yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Bir Doğru bir açıklama ölçüde bu soruna iyi bir çözüm olmasının nedeni göstererek uzun vadeli değerini artıracak ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen cevabınızı düzenleyin .
14'te kodlandı

0

Bir web sitesindeki verileri okumak için requestsve beautifulsoupkitaplıkları kullanabilirsiniz . Sadece bu iki kitaplığı kurun ve aşağıdaki kodu yazın.

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

Kütüphane hakkında ihtiyacınız olan tüm bilgileri alacaksınız.


helpverilen modül / sınıf / işlevin belgelerini görüntülemek için kullanılır. Sanırım bu soru yanıtın içeriğini görüntülemenin bir yolunu soruyor
Panagiotis Simakis

Teşekkürler, ama bu gerçekten eski bir soru ve şimdiden yanıtlandı. Teşekkürler ve stackoverflow'a hoş geldiniz.
Helen Neely
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.