Як я можу прочитати вміст URL-адреси за допомогою Python?


93

Наступне працює, коли я вставляю його у браузер:

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

Але коли я намагаюся прочитати URL-адресу за допомогою Python, нічого не відбувається:

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

Чи потрібно мені кодувати URL-адресу, або щось я не бачу?

Відповіді:


156

Щоб відповісти на ваше запитання:

import urllib

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

Вам потрібно read(), ніreadline()

EDIT (25.06.2018): З Python 3, спадщина urllib.urlopen() було замінено на urllib.request.urlopen()(докладніше див. Примітки з https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen ) .

Якщо ви використовуєте Python 3, перегляньте відповіді Мартіна Томи або innm у цьому питанні: https://stackoverflow.com/a/28040508/158111 (Python 2/3 compat) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Або просто завантажте цю бібліотеку тут: http://docs.python-requests.org/en/latest/ і серйозно користуйтеся нею :)

import requests

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

@KiranSubbaraman це дійсно хороший проект, від API до структури коду
woozyking

Я також рекомендую та заохочую програміста використовувати новий бренд- requestsмодуль, його використання відповідає більш пітонічному коду.
Ганс Цімерманн,

1
Я отримую таку помилку на 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'Здається, у python 3.5 немає функції urlopen. Чи було його перейменовано? EDIT: Фрагмент у відповіді нижче вирішує:from urllib.request import urlopen
LMD

@ user7185318 так, у Python 3 urlibпакет зазнав певних змін у рефакторингу та API. Я
оновлю

що, якщо надане посилання запитує ім’я користувача та пароль? Як тоді можна змінити код?
Доктор Ессен,

27

Для python3економії часу користувачі використовують такий код,

from urllib.request import urlopen

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

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

Я знаю, що існують різні теми для помилок:, Name Error: urlopen is not definedале думав, що це може заощадити час.


Це не найкращий спосіб читати дані з URL-адреси за допомогою python3, оскільки він втрачає переваги оператора 'with'. Дивіться мою відповідь: stackoverflow.com/a/56295038/908316
Джаред

ні, це не буде працювати на циклі while. лише один дзвінок. що
відмовно,

10

Рішення, що працює з Python 2.X та Python 3.X, використовує бібліотеку сумісності Python 2 та 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

Жодна з цих відповідей не дуже хороша для Python 3 (перевірена на останній версії на момент цієї публікації).

Ось як ви це робите ...

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)

Вище для вмісту, який повертає 'utf-8'. Видаліть .decode ('utf-8'), якщо ви хочете, щоб python "вгадав відповідне кодування".

Документація: https://docs.python.org/3/library/urllib.request.html#module-urllib.request


Дякуємо, оригінальний код був написаний для Python 2, але ваш внесок тут зазначено.
Хелен Нілі

2

Ми можемо прочитати HTML-вміст веб-сайту, як показано нижче:

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

2
Це те саме, що відповідь від @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-адреса повинна мати рядок:

import urllib

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

11
І ', і "- це рядки в Python
Лев

0

Я використав такий код:

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)

Дякуємо за цей фрагмент коду, який може надати обмежену негайну допомогу. Належне пояснення буде значно поліпшити свою довгострокову цінність, показуючи , чому це є хорошим рішенням проблеми і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи припущення, які ви зробили.
codedge

0

Ви можете використовувати requestsі beautifulsoupбібліотеки для читання даних на веб-сайті. Просто встановіть ці дві бібліотеки та введіть наступний код.

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

Ви отримаєте всю необхідну інформацію про бібліотеку.


helpвикористовується для перегляду документації даного модуля / класу / функції. Я думаю, що це запитання задає спосіб перегляду вмісту відповіді
Панайотис Сімакіс,

Дякую, але це справді давнє запитання, на яке вже відповіли. Дякуємо і ласкаво просимо до stackoverflow.
Хелен Нілі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.