【问题标题】:Why does "find" produce string type?为什么“查找”会产生字符串类型?
【发布时间】:2019-01-18 15:59:50
【问题描述】:

我是一名学习者,我使用 Python 3.7。

据我了解,find 函数应该指示字符串的索引位置。

当我的输入是像这样的直字符串时,它会这样做

myString='Blabla<body>blabla'.

现在

myString.find('<body>')

返回 6。 惊人的。 但是当我从网页导入字符串时,我得到了错误

TypeError: argument should be integer or bytes-like object, not 'str'

我完全同意,但我不明白为什么这个论点首先是str

我的代码:

import ssl, urllib.request
url = 'http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm'

response = urllib.request.urlopen(url)
Content = response.read()
startposition = Content.find('<body>')
print(startposition)

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    Contentbytes 类型,所以 Content.find 的参数必须是 bytesint,但 '&lt;body&gt;'str 类型。所以,你得到了不匹配的类型。

    如何解决:将str 转换为bytes

    Content.find(b'<body>')
    

    【讨论】:

    • 好的,可以了,非常感谢。我仍然需要了解原因。为什么这段代码中的内容默认是字节类型的?
    • 因为字节是通过网络传输的,保存到您的文件系统等。Python 字符串(python 3)是 unicode 字符串,而不是字节序列。您可能想阅读更多关于字节和 unicode 的信息:joelonsoftware.com/2003/10/08/…
    【解决方案2】:

    我不明白为什么参数是'str'。

    因为这就是您传递的内容:'&lt;body&gt;' 是文字 str 对象。在你问之前,Content 是一个 bytes 对象,必须对其进行解码(使用在响应中声明的 编码)以获得正确的字符串。

    现在,urllib 文档本身推荐的一个更简单的解决方案是使用第 3 部分 python-requests 库,它将为您处理那些烦人的细节。

    此外,如果您想解析 HTML,请务必使用适当的 HTML 解析器(如果您必须处理可能格式不正确的 html,这是迄今为止最常见的情况,推荐选择 BeautifulSoup)。

    【讨论】:

      【解决方案3】:

      这里的内容是一个字节对象。您正在尝试通过字节对象搜索字符串。通过更改行将内容转换为字符串

      Content = response.read()
      

      Content = str(response.read())
      

      【讨论】:

      • 诊断看起来不错,但解决方法显然是错误的 - 您不能只将bytes 传递给str() 并期望得到一些明智的结果,您必须解码 字节到 unicode (str),这也需要知道编码。
      • 啊,我明白了,我以为读取编码站点是一个微不足道的问题,而忽略了解码。我的坏
      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 2013-10-26
      • 2020-06-26
      • 2016-12-30
      • 2012-06-10
      • 1970-01-01
      • 2022-07-06
      • 2012-09-13
      相关资源
      最近更新 更多