python - urllib.request:POST 数据应该是字节、字节的可迭代或文件对象
问题描述
我需要访问一个 HTML 网站并在该网站上搜索图像。它可能不是那么漂亮,但我可以访问该网站,我只需要一些有关搜索 IMG 的最佳方式的指导。
我试图将它视为一个文件,但我收到一条错误消息,提示我需要将数据转换为字节。
让我知道你的想法。
from urllib import request
import re
website = request.urlopen('https://www.google.com', "rb")
html = website.read()
hand = html.decode("UTF-8")
for line in hand:
line = line.rstrip()
if re.search('^img', line):
print(line)
TypeError: POST 数据应该是字节、可迭代的字节或文件对象。它不能是 str 类型
我希望得到一个 imgs 列表
解决方案
它可能不是那么漂亮,但我可以访问该网站..
实际上,鉴于错误来自调用访问该网站的函数,您无法访问该网站。
您需要查看urllib.request.urlopen()
.
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
在这行代码中:
website = request.urlopen('https://www.google.com', "rb")
...字符串'rb'
被解释为data
要在您的请求正文中发送的参数。这是因为您提供了 2 个位置参数,其中'rb'
第二个data
是函数签名中的第二个位置参数。
这是data
允许的:
支持的对象类型包括字节、类文件对象和可迭代对象。
所以字符串'rb'
不是这些类型中的任何一种。
但这里真正的问题是您在猜测如何使用该功能。open()
内置函数和函数在urllib.request.urlopen()
操作方式上非常不同,因此您需要阅读文档以了解如何正确使用它们。
另外,我想建议除非您绝对必须使用urllib
,否则请改用该requests
库。
推荐阅读
- javascript - Ramda 如何将参数传递给高阶函数?
- c++-winrt - C++/WinRT 是否提供从枚举符号到字符串名称的映射?
- r - 如何在R中拆分数据框
- c++ - 在 C++ 中向上转换和向下转换跳过层次结构?
- r - 在列中查找起始值并递增 1 直到最后一年
- c# - 删除前的 MessageBox - wpf datagrid
- algorithm - 给定anxn矩阵,其中每一行和每一列都按升序排序,找到矩阵中的第k个最小元素
- node.js - Ubuntu 16.04 - 尽管已全局安装,但 nodejs 无法找到模块
- kotlin - kotlin中具有扩展功能的伴侣对象?
- python - 如何比较熊猫数据框中的行子集