Wie kann ich den Inhalt einer URL mit Python lesen?

91

Folgendes funktioniert, wenn ich es in den Browser einfüge:

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

Aber wenn ich versuche, die URL mit Python zu lesen, passiert nichts:

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

Muss ich die URL verschlüsseln oder gibt es etwas, das ich nicht sehe?

Helen Neely
quelle

Antworten:

155

Zur Beantwortung Ihrer Frage:

import urllib

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

Das musst du read()nichtreadline()

BEARBEITEN (2018-06-25): Seit Python 3 wurde das Erbe urllib.urlopen()durch ersetzt urllib.request.urlopen()( Einzelheiten finden Sie in den Hinweisen unter https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen ). .

Wenn Sie Python 3 verwenden, finden Sie Antworten von Martin Thoma oder innm in dieser Frage: https://stackoverflow.com/a/28040508/158111 (Python 2/3 kompatibel) https://stackoverflow.com/a/45886824 / 158111 (Python 3)

Oder holen Sie sich diese Bibliothek einfach hier: http://docs.python-requests.org/en/latest/ und verwenden Sie sie ernsthaft :)

import requests

link = "http://www.somesite.com/details.pl?urn=2344"
f = requests.get(link)
print(f.text)
woozyking
quelle
@ KiranSubbaraman es ist ein wirklich gutes Projekt, von APIs bis zur
Codestruktur
Ich empfehle und ermutige den Programmierer auch, das neue Markenmodul zu verwenden requests, dessen Verwendung einem pythonischeren Code entspricht.
Hans Zimermann
1
Ich 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'erhalte die folgende Fehlermeldung in Python 3.5.2: Anscheinend gibt es in Python 3.5 keine URLopen-Funktion. Wurde es umbenannt? EDIT: Snippet in Antwort unten löst:from urllib.request import urlopen
LMD
@ user7185318 Ja, in Python 3 wurden im urlibPaket einige Refactoring- und API-Änderungen vorgenommen. Ich werde die Antwort aktualisieren, um Python 2 hervorzuheben.
woozyking
Was passiert, wenn der angegebene Link nach Benutzername und Passwort fragt? Wie kann dann der Code geändert werden?
Dr. Essen
26

Für python3Benutzer, zu der Zeit, verwenden Sie den folgenden Code zu speichern,

from urllib.request import urlopen

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

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

Ich weiß, dass es verschiedene Threads für Fehler gibt:, Name Error: urlopen is not defineddachte aber, dies könnte Zeit sparen.

innm
quelle
Dies ist nicht der beste Weg, um Daten aus einer URL mit python3 zu lesen, da die Vorteile der 'with'-Anweisung nicht berücksichtigt werden. Siehe meine Antwort: stackoverflow.com/a/56295038/908316
Jared
10

Eine Lösung mit Python 2.X und Python 3.X verwendet die Python 2- und 3-Kompatibilitätsbibliothek 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
quelle
8

Keine dieser Antworten ist sehr gut für Python 3 (getestet auf der neuesten Version zum Zeitpunkt dieses Beitrags).

Das ist wie man es macht...

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)

Das Obige gilt für Inhalte, die 'utf-8' zurückgeben. Entfernen Sie .decode ('utf-8'), wenn Python "die richtige Codierung erraten" soll.

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

Jared
quelle
Vielen Dank, der ursprüngliche Code wurde für Python 2 geschrieben, aber Ihr Beitrag hier wurde zur Kenntnis genommen.
Helen Neely
2

Wir können den HTML-Inhalt der Website wie folgt lesen:

from urllib.request import urlopen
response = urlopen('http://google.com/')
html = response.read()
print(html)
Akash K.
quelle
2
Dies ist das gleiche wie die Antwort von @innm
PeyM87
0

Die URL sollte eine Zeichenfolge sein:

import urllib

link = "http://www.somesite.com/details.pl?urn=2344"
f = urllib.urlopen(link)           
myfile = f.readline()  
print myfile
ATOzTOA
quelle
11
Sowohl 'als auch "sind Zeichenfolgen in Python
Leo
0

Ich habe den folgenden Code verwendet:

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
quelle
0
#!/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
quelle
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
quelle
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)
Vir 哲学家 Elvira
quelle
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte und sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Codedge
0

Sie können requestsund beautifulsoupBibliotheken verwenden, um Daten auf einer Website zu lesen. Installieren Sie einfach diese beiden Bibliotheken und geben Sie den folgenden Code ein.

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

Sie erhalten alle Informationen, die Sie über die Bibliothek benötigen.

Rajodiya Jeel
quelle
helpwird verwendet, um die Dokumentation des angegebenen Moduls / der Klasse / der Funktion anzuzeigen. Ich denke, diese Frage fragt nach einer Möglichkeit, den Inhalt der Antwort
anzuzeigen
Danke, aber das ist wirklich eine alte Frage, die bereits beantwortet wurde. Danke und willkommen bei stackoverflow.
Helen Neely