Jak mogę odczytać zawartość adresu URL za pomocą Pythona?

93

Poniższe działa, gdy wklejam go w przeglądarce:

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

Ale kiedy próbuję odczytać adres URL w Pythonie, nic się nie dzieje:

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

Czy muszę zakodować adres URL, czy jest coś, czego nie widzę?

Helen Neely
źródło

Odpowiedzi:

156

Odpowiedzieć na Twoje pytanie:

import urllib

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

Trzeba read(), niereadline()

EDYCJA (2018-06-25): Od czasu Pythona 3, dziedzictwo urllib.urlopen()zostało zastąpione przez urllib.request.urlopen()(szczegółowe informacje znajdują się w uwagach z https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen ) .

Jeśli używasz Pythona 3, zapoznaj się z odpowiedziami Martina Thomy lub innm w ramach tego pytania: https://stackoverflow.com/a/28040508/158111 (Python 2/3 Comp.) Https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Lub po prostu pobierz tę bibliotekę tutaj: http://docs.python-requests.org/en/latest/ i poważnie z niej korzystaj :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)
woozyking
źródło
@KiranSubbaraman to naprawdę dobry projekt, od API po strukturę kodu
woozyking
Polecam również i zachęcam programistę do używania nowego requestsmodułu marki , jego użycie prowadzi do bardziej Pythonowego kodu.
Hans Zimermann
1
W pythonie 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'pojawia się następujący błąd: Wygląda na to, że w pythonie 3.5 nie ma funkcji urlopen. Czy została zmieniona? EDYCJA: Fragment w odpowiedzi poniżej rozwiązuje:from urllib.request import urlopen
LMD
@ user7185318 tak, w Pythonie 3 urlibpakiet widział pewne refaktoryzacje i zmiany API. Zaktualizuję odpowiedź, aby podkreślić Python 2.
woozyking,
co jeśli podany link prosi o nazwę użytkownika i hasło? Jak więc można zmienić kod?
Dr. Essen
27

Dla python3użytkowników, aby zaoszczędzić czas, użyj następującego kodu,

from urllib.request import urlopen

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

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

Wiem, że istnieją różne wątki dotyczące błędów: Name Error: urlopen is not definedale pomyślałem, że może to zaoszczędzić czas.

innm
źródło
Nie jest to najlepszy sposób odczytywania danych z adresu URL za pomocą python3, ponieważ pomija korzyści płynące z instrukcji „with”. Zobacz moją odpowiedź: stackoverflow.com/a/56295038/908316
Jared
nie, to nie będzie działać w pętli while. tylko jedno połączenie. co jest do
niczego
11

Rozwiązanie współpracujące z Python 2.X i Python 3.X korzysta z biblioteki kompatybilności z Python 2 i 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
źródło
8

Żadna z tych odpowiedzi nie jest bardzo dobra dla Pythona 3 (testowana w najnowszej wersji w czasie tego postu).

Tak to się robi...

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)

Powyższe dotyczy zawartości, która zwraca „utf-8”. Usuń .decode ('utf-8'), jeśli chcesz, aby Python „odgadł odpowiednie kodowanie”.

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

Jared
źródło
Dziękujemy, oryginalny kod został napisany dla Pythona 2, ale Twój wkład w to został odnotowany.
Helen Neely
2

Treść html strony możemy odczytać jak poniżej:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)
Akash K.
źródło
2
To jest to samo, co odpowiedź z @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
źródło
0

Adres URL powinien być ciągiem:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)           
myfile = f.readline()  
print myfile
ATOzTOA
źródło
11
Zarówno ', jak i' są ciągami znaków w Pythonie
Leo
0

Użyłem następującego kodu:

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
źródło
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
źródło
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
źródło
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu i byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
zakodowane
0

Do odczytywania danych w witrynie internetowej można używać bibliotek requestsi beautifulsoup. Po prostu zainstaluj te dwie biblioteki i wpisz następujący kod.

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

Otrzymasz wszystkie potrzebne informacje o bibliotece.

Rajodiya Jeel
źródło
helpsłuży do przeglądania dokumentacji danego modułu / klasy / funkcji. Myślę, że to pytanie dotyczy sposobu wyświetlenia treści odpowiedzi
Panagiotis Simakis
Dzięki, ale to jest naprawdę stare pytanie, na które już udzielono odpowiedzi. Dziękujemy i witamy w stackoverflow.
Helen Neely