Bagaimana saya bisa membaca konten URL dengan Python?

93

Berikut ini adalah cara kerja saat saya menempelkannya di browser:

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

Tetapi ketika saya mencoba membaca URL dengan Python tidak ada yang terjadi:

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

Apakah saya perlu menyandikan URL, atau adakah sesuatu yang tidak saya lihat?

Helen Neely
sumber

Jawaban:

156

Untuk menjawab pertanyaan Anda:

import urllib

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

Anda perlu read(), tidakreadline()

EDIT (2018-06-25): Sejak Python 3, warisan urllib.urlopen()digantikan oleh urllib.request.urlopen()(lihat catatan dari https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen untuk detailnya) .

Jika Anda menggunakan Python 3, lihat jawaban oleh Martin Thoma atau innm dalam pertanyaan ini: https://stackoverflow.com/a/28040508/158111 (Python 2/3 compat) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Atau, dapatkan saja pustaka ini di sini: http://docs.python-requests.org/en/latest/ dan serius menggunakannya :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)
woozyking
sumber
@KiranSubbaraman ini adalah proyek yang sangat bagus, dari API hingga struktur kode
woozyking
Saya juga merekomendasikan dan mendorong programmer untuk menggunakan requestsModul merek baru , penggunaannya yelds ke Kode yang lebih Pythonic.
Hans Zimermann
1
Saya mendapatkan kesalahan berikut pada 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'Sepertinya tidak ada fungsi urlopen di python 3.5. Apakah sudah diganti namanya? EDIT: Cuplikan dalam jawaban di bawah menyelesaikan:from urllib.request import urlopen
LMD
@ user7185318 ya dengan Python 3 urlibpaket melihat beberapa refactoring dan perubahan API. Saya akan memperbarui jawaban untuk menekankan pada Python 2.
woozyking
bagaimana jika tautan yang disediakan meminta nama pengguna dan kata sandi? Lalu bagaimana kode bisa diubah?
Dr. Essen
27

Bagi python3pengguna, untuk menghemat waktu, gunakan kode berikut,

from urllib.request import urlopen

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

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

Saya tahu ada utas berbeda untuk kesalahan:, Name Error: urlopen is not definedtetapi saya pikir ini mungkin menghemat waktu.

innm
sumber
Ini bukan cara terbaik untuk membaca data dari url menggunakan python3 karena tidak ada manfaat pernyataan 'dengan'. Lihat jawaban saya: stackoverflow.com/a/56295038/908316
Jared
tidak, ini tidak akan berfungsi pada while loop. satu panggilan saja. yang payah jika Anda bertanya kepada saya
lone_coder
11

Solusi dengan bekerja dengan Python 2.X dan Python 3.X memanfaatkan pustaka kompatibilitas Python 2 dan 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
sumber
8

Tak satu pun dari jawaban ini sangat bagus untuk Python 3 (diuji pada versi terbaru pada saat posting ini).

Beginilah cara Anda melakukannya ...

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)

Di atas adalah untuk konten yang mengembalikan 'utf-8'. Hapus .decode ('utf-8') jika Anda ingin python "menebak encoding yang sesuai".

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

Jared
sumber
Terima kasih, kode asli ditulis untuk Python 2, tetapi kontribusi Anda di sini telah dicatat.
Helen Neely
2

Kita bisa membaca konten html website seperti di bawah ini:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)
Akash K
sumber
2
Ini sama dengan jawaban dari @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
sumber
0

URL harus berupa string:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)           
myfile = f.readline()  
print myfile
ATOzTOA
sumber
11
Keduanya 'dan "adalah string dalam Python
Leo
0

Saya menggunakan kode berikut:

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
sumber
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
sumber
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
sumber
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan langsung. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Mohon edit jawaban Anda untuk menambahkan penjelasan, termasuk asumsi yang Anda buat.
kode
0

Anda dapat menggunakan perpustakaan requestsdan beautifulsoupuntuk membaca data di situs web. Instal saja kedua pustaka ini dan ketik kode berikut.

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

Anda akan mendapatkan semua informasi yang Anda butuhkan tentang perpustakaan.

Rajodiya Jeel
sumber
helpdigunakan untuk melihat dokumentasi dari modul / kelas / fungsi yang diberikan. Saya pikir pertanyaan itu menanyakan cara untuk melihat konten tanggapan
Panagiotis Simakis
Terima kasih, tapi ini pertanyaan yang sangat lama, dan sudah terjawab. Terima kasih dan selamat datang di stackoverflow.
Helen Neely