首页 > 解决方案 > Python中的基本浏览器。从用户那里获取 URL

问题描述

我正在阅读一本名为 Python For Everbody 的书,并且已经被一个问题困住了几天。我很确定这是我没有看到但似乎无法破解的超级简单的东西。

如果发布在错误的位置或格式不正确,请提前道歉。这是我的第一篇文章,我正在考虑这一切。

所以,练习是从一个基本的互联网浏览器开始......

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
    print(data.decode(),end='')

mysock.close()

任务是重写代码,以便将 url 作为输入。我遇到的问题是将输入变量添加到 cmd 行中。我已经尝试过以下方法:

import socket

# Establish url and server from user input
url = input('Please enter url>>')
clnpos = url.find(':')
server = url[clnpos +3:len(url)]

# Run program with variable
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((server), 80)
cmd = ('GET', (url), 'HTTP/1.0\r\n\r\n'.encode())
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
    print(data.decode(),end='')

mysock.close()

我也试过让 cmd 行成为它自己的变量......

import socket

url = input('Please enter url>>')

clnpos = url.find(':')
server = url[clnpos +3:len(url)]
cmdline = ('GET', (url), 'HTTP/1.0\r\n\r\n'.encode())

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((server), 80)
cmd = (cmdline)
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
    print(data.decode(),end='')

mysock.close()

就像我说的那样,我很确定我错过了一些愚蠢的东西,几乎觉得发帖很尴尬,但我就是看不出我哪里出错了。

提供的任何帮助将不胜感激。

标签: pythonpython-3.xsocketshttpbrowser

解决方案


mysock.connect只接受一个参数,它必须是一个元组。你只需要移动你的括号一点点

mysock.connect((server, 80))

您的cmd变量也有错误,它必须是一个字符串。

您必须连接字符串的三个部分。最好的方法是使用f-string

cmd  = f'GET {url} HTTP/1.0\r\n\r\n'.encode()

或者你可以做

cmd = "GET {} HTTP/1.0\r\n\r\n".format(url).encode()

完整代码:

import socket

# Establish url and server from user input
url = input('Please enter url>>')
clnpos = url.find(':')
server = url[clnpos +3:len(url)]

# Run program with variable
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((server, 80))
# mysock.connect((server, 80))
cmd = f'GET {url} HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
    print(data.decode(),end='')

mysock.close()

推荐阅读