python - 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()
就像我说的那样,我很确定我错过了一些愚蠢的东西,几乎觉得发帖很尴尬,但我就是看不出我哪里出错了。
提供的任何帮助将不胜感激。
解决方案
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()
推荐阅读
- c# - 不同移动宽高比的背景缩放。统一 2D / C#
- powershell - 如何从 PowerShell 中的 Get-ChildItem 中排除文件和文件夹?
- python - 为什么要复制(列表、字典)
- json - 在 Json 中访问字符串数组
- excel - Excel - 如何在数据透视表中查找特定数据透视字段的位置(即哪些列)?
- docusignapi - DocuSign - 你能对其他方隐藏收件人签名吗
- javascript - 是否可以删除超过 14 天的消息?(discord.js)
- django - 在现有应用程序中添加另一个模板时出错
- react-native - React Native 以编程方式在元素上滑动手势
- unit-testing - 如何在 go 中测试 pubsub 消息确认?