首页 > 解决方案 > 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 列表

标签: pythonurllib

解决方案


它可能不是那么漂亮,但我可以访问该网站..

实际上,鉴于错误来自调用访问该网站的函数,您无法访问该网站。

您需要查看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库。


推荐阅读