Làm cách nào để đọc nội dung của URL bằng Python?


93

Những điều sau sẽ hoạt động khi tôi dán nó vào trình duyệt:

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

Nhưng khi tôi thử đọc URL bằng Python thì không có gì xảy ra:

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

Tôi có cần mã hóa URL hay có điều gì đó tôi không nhìn thấy?

Câu trả lời:


156

Để trả lời câu hỏi của bạn:

import urllib

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

Bạn cần read(), khôngreadline()

CHỈNH SỬA (2018-06-25): Kể từ Python 3, kế thừa urllib.urlopen()đã được thay thế bằng urllib.request.urlopen()(xem ghi chú từ https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen để biết chi tiết) .

Nếu bạn đang sử dụng Python 3, hãy xem câu trả lời của Martin Thoma hoặc innm trong câu hỏi này: https://stackoverflow.com/a/28040508/158111 (Python 2/3 compat) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Hoặc, chỉ cần tải thư viện này tại đây: http://docs.python-requests.org/en/latest/ và nghiêm túc sử dụng nó :)

import requests

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

@KiranSubbaraman đó là một dự án thực sự tốt, từ API đến cấu trúc mã
woozyking

Tôi cũng khuyến khích và khuyến khích lập trình viên sử dụng requestsMô-đun thương hiệu mới , việc sử dụng nó giống với Mã Pythonic hơn.
Hans Zimermann

1
Tôi gặp lỗi sau trên 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'Có vẻ như không có chức năng urlopen trong python 3.5. Nó đã được đổi tên chưa? CHỈNH SỬA: Đoạn mã trong câu trả lời bên dưới giải được:from urllib.request import urlopen
LMD

@ user7185318 vâng trong Python 3, urlibgói đã thấy một số thay đổi về cấu trúc lại và API. Tôi sẽ cập nhật câu trả lời để nhấn mạnh trên Python 2.
woozyking

điều gì xảy ra nếu liên kết được cung cấp yêu cầu tên người dùng và mật khẩu? Làm thế nào sau đó mã có thể được thay đổi?
Tiến sĩ Essen

27

Đối với python3người dùng, để tiết kiệm thời gian, hãy sử dụng mã sau,

from urllib.request import urlopen

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

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

Tôi biết có nhiều chủ đề khác nhau cho lỗi:, Name Error: urlopen is not definednhưng tôi nghĩ điều này có thể tiết kiệm thời gian.


Đây không phải là cách tốt nhất để đọc dữ liệu từ một url bằng python3 vì nó bỏ lỡ lợi ích của câu lệnh 'with'. Xem câu trả lời của tôi: stackoverflow.com/a/56295038/908316
Jared

không, điều này sẽ không hoạt động trên vòng lặp while. một cuộc gọi duy nhất.
Thật

10

Một giải pháp hoạt động với Python 2.X và Python 3.X sử dụng thư viện tương thích Python 2 và 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)

8

Không có câu trả lời nào trong số này là rất tốt cho Python 3 (đã được thử nghiệm trên phiên bản mới nhất tại thời điểm đăng bài này).

Đây là cách bạn làm điều đó...

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)

Phần trên dành cho nội dung trả về 'utf-8'. Xóa .decode ('utf-8') nếu bạn muốn python "đoán mã hóa phù hợp".

Tài liệu: https://docs.python.org/3/library/urllib.request.html#module-urllib.request


Cảm ơn, mã gốc được viết cho Python 2, nhưng đóng góp của bạn ở đây đã được ghi nhận.
Helen Neely

2

Chúng ta có thể đọc nội dung html của trang web như dưới đây:

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

2
Điều này giống với câu trả lời từ @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

0

URL phải là một chuỗi:

import urllib

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

11
Cả hai "và" là chuỗi bằng Python
Leo

0

Tôi đã sử dụng mã sau:

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)

Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp hạn chế, tức thì. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc trong tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm cả những giả định bạn đã đưa ra.
mã hóa

0

Bạn có thể sử dụng requestsbeautifulsoupcác thư viện để đọc dữ liệu trên một trang web. Chỉ cần cài đặt hai thư viện này và gõ mã sau.

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

Bạn sẽ nhận được tất cả thông tin bạn cần về thư viện.


helpđược sử dụng để xem tài liệu về mô-đun / lớp / chức năng đã cho. Tôi nghĩ rằng câu hỏi đó yêu cầu một cách để xem nội dung của câu trả lời
Panagiotis Simakis

Cảm ơn, nhưng đây thực sự là câu hỏi cũ, và đã được trả lời. Cảm ơn và chào mừng bạn đến với stackoverflow.
Helen Neely
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.