Как я могу прочитать содержимое 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()

РЕДАКТИРОВАТЬ (2018-06-25): Начиная с 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модуль, его использование приводит к большему количеству Pythonic Code.
Hans
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. Его переименовали? РЕДАКТИРОВАТЬ: фрагмент в ответе ниже решает: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. только один звонок. что отстой, если вы спросите меня
lone_coder
11

Решение, работающее с 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()
ksono
источник
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)
荷兰 哲学家 Эльвира
источник
Спасибо за этот фрагмент кода, который может оказать некоторую немедленную помощь. Надлежащее объяснение будет значительно улучшить свою долгосрочную ценность, показывая , почему это является хорошим решением проблемы и сделает его более полезным для читателей будущих с другими подобными вопросами. Пожалуйста , измените свой ответ , чтобы добавить некоторые объяснения, в том числе допущений , которые вы сделали.
кодировка
0

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

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

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

Раджодия Джил
источник
helpиспользуется для просмотра документации по данному модулю / классу / функции. Я думаю, что этот вопрос предлагает способ просмотреть содержание ответа
Панайотис Симакис
Спасибо, но это действительно старый вопрос, и на него уже был дан ответ. Спасибо и добро пожаловать в stackoverflow.
Хелен Нили