urllib.request:POST数据应为字节,字节可迭代或文件对象

时间:2019-03-27 03:13:22

标签: python urllib

我需要访问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

类型

我希望得到一张img列表

2 个答案:

答案 0 :(得分:0)

  

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

实际上,鉴于错误是由于调用访问网站的功能引起的,因此您将无法访问该网站。

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

答案 1 :(得分:0)

function urlopen的签名是:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

在您的代码中,urlopen('https://www.google.com', "rb")将“ rb”字符串设置为data参数,而不是另一个函数mode中的open参数。